MLT多媒体框架生产消费架构解析
- 通过本文可以获取什么?
- 核心类层级关系
- 生产消费者架构
- 生产者初始化
- 消费者初始化
- 生产消费关联启动
- demon展示
- 使用Consumer(sdl)消费Producer(mp4)效果
- 代码
- 附属代码下载链接
- 参考资料
通过本文可以获取什么?
- 了解LGPL多媒体框架MLT的核心C++类封装的层级关系
- 了解MLT的生产消费者架构
- demon演示生产-消费的使用
核心类层级关系
MLT官方有为MLT库提供C++包装,根据MLT的设计梳理了核心类的层级关系,如下图:
如上图可见:整个封装分为4个层级,简单介绍一下关键类的功能:
- Properties:这个基类提供了后续所有派生类属性的序列化与反序列化能力。
- Service:这个服务类将会提供给消费者与生产者连接的能力、滤镜的订阅与反订阅能力等功能。
- Producer:生产者类,所有剪辑处理的最小单位。
- Playlist:生产者的容器。
生产消费者架构
生产消费基础流程图如下:
生产者初始化
// 默认视频图像制式设置是dv_pal(PAL特点:每秒钟有25帧,奇数场,主要应用在中国、香港、中东地区和欧洲一带,视频输出常用格式是PAL制式)Profile profile; // 根据profile配置与媒体资源初始化生产者Producer producer(profile, filename);
消费者初始化
// 默认初始化为sdlConsumer consumer(profile); // 防止缩小到 profile 配置的尺寸.// 让 sdl consumer 做所有的缩放.consumer.set("rescale", "none");// 在文件结束时自动退出.consumer.set("terminate_on_pause", 1);
生产消费关联启动
// 从Service继承的关联消费者的能力consumer.connect(producer);// 启动consumer.run();consumer.stop();
demon展示
使用Consumer(sdl)消费Producer(mp4)效果
代码
void play(const char *filename){qDebug() << filename;Profile profile; // defaults to dv_palProducer producer(profile, filename);Consumer consumer(profile); // defaults to sdl// Prevent scaling to the profile size.// Let the sdl consumer do all scaling.consumer.set("rescale", "none");// Automatically exit at end of file.// consumer.set("terminate_on_pause", 1);consumer.connect(producer);consumer.run();consumer.stop();}void func1(){Factory::init();play("D:\\msys64\\home\\Administrator\\mltDemon\\qianyuqianxunKTV.mp4");// 替换自己本地的资源路径Factory::close();}
附属代码下载链接
源代码下载链接
参考资料
【1】MLT github链接
【2】官方代码示例