MLTMLT多媒体框架生产消费架构解析
Posted 一二三o-0-O
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MLTMLT多媒体框架生产消费架构解析相关的知识,希望对你有一定的参考价值。
MLT多媒体框架生产消费架构解析
前提
- 通过阅读【MLT】MLT多媒体框架生产消费架构解析(一)满足以下两点:
- 了解MLT的核心C++封装的层级关系
- 掌握使用MLT的Consumer(sdl)消费Producer(MP4)
- 通过阅读【MLT】MLT多媒体框架生产消费架构解析(二)满足以下两点:
- 了解Service(服务抽象基类)与 Filter(滤镜抽象服务类)
- 掌握为Producer(生产者)添加Filter(滤镜)
通过本文可以获取什么?
本文将在【MLT】MLT多媒体框架生产消费架构解析(二)的基础上对给生产者attach的滤镜做宽高属性的变换,如下图:
核心类解析
Properties
【MLT】MLT多媒体框架生产消费架构解析(一)中只是简单演示了生产者(初始化了一个视频资源)被消费者(初始化为SDL)消费的简单过程。【MLT】MLT多媒体框架生产消费架构解析(二)给(一)中简单给视频生产者做了加工,添加了一个视频滤镜。如上图所示,本节对滤镜设置属性引入了新的封装:Properties(属性类),提供了与Service通信的一般机制,我们可以操作和序列化Service状态。本节只对我们即将使用的方法做简单介绍,后续会完整对属性封装作分析。
// 属性类
// 此类重载了大量的序列化的方法,供各种各样的场景使用
/**
* @brief set 序列化方法
* @param name 要设置的属性key
* @param value 属性值(char*)
* @return 是否设置成功的错误码
*/
int set( const char *name, const char *value );
/**
* @brief set_string 序列化方法
* @param name 要设置的属性key
* @param value 属性值(char*)
* @return 是否设置成功的错误码
*/
int set_string( const char *name, const char *value );
/**
* @brief set 序列化方法
* @param name 要设置的属性key
* @param value 属性值(int)
* @return 是否设置成功的错误码
*/
int set( const char *name, int value );
/**
* @brief set 序列化方法
* @param name 要设置的属性key
* @param value 属性值(int64_t)
* @return 是否设置成功的错误码
*/
int set( const char *name, int64_t value );
/**
* @brief set 序列化方法
* @param name 要设置的属性key
* @param value 属性值(double)
* @return 是否设置成功的错误码
*/
int set( const char *name, double value );
/**
* @brief set 序列化方法
* @param name 要设置的属性key
* @param value 属性值(double)
* @param size 默认传0
* @param destroy 析构方法
* @param serial 序列化方法
* @return 是否设置成功的错误码
*/
int set( const char *name, void *value, int size, mlt_destructor destroy = NULL, mlt_serialiser serial = NULL );
/**
* @brief set 序列化方法
* @param name 要设置的属性key
* @param value 属性值(mlt_color)
* @return 是否设置成功的错误码
*/
int set( const char *name , mlt_color value );
/**
* @brief set 序列化方法
* @param name 要设置的属性key
* @param value 属性值(mlt_rect)
* @return 是否设置成功的错误码
*/
int set( const char *name, mlt_rect value );
/**
* @brief set 序列化方法
* @param name 要设置的属性key
* @param x x值
* @param y y值
* @param w width值
* @param h height值
* @param opacity opacity值
* @return 是否设置成功的错误码
*/
int set( const char *name, double x, double y, double w, double h, double opacity = 1.0 );
/**
* @brief set 序列化方法
* @param name 要设置的属性key
* @param properties 属性值(Properties)
* @return
*/
int set( const char *name, Properties& properties );
为生产者添加滤镜
// 创建马赛克滤镜
Mlt::Filter *filter = new Mlt::Filter(profile, "frei0r.pixeliz0r");
// 使用从属性类继承的序列化能力对马赛克滤镜的宽高属性进行设置
filter->set(qUtf8Printable("0"), 0.000); // width不做变化
filter->set(qUtf8Printable("1"), 0.300); // height做变化
// 使用从父类Service中继承的订阅能力添加滤镜
producer.attach(*filter);
Demon展示
修改Filter(马赛克)效果
- 滤镜只对width设置
- 滤镜只对height设置
代码
Profile profile; // defaults to dv_pal
Producer producer(profile, filename);
Consumer consumer(profile); // defaults to sdl
Mlt::Filter *filter = new Mlt::Filter(profile, "frei0r.pixeliz0r");
filter->set(qUtf8Printable("0"), 0.300);
filter->set(qUtf8Printable("1"), 0.300);
producer.attach(*filter);
// 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();
附属代码下载链接
参考资料
【1】MLT github链接
以上是关于MLTMLT多媒体框架生产消费架构解析的主要内容,如果未能解决你的问题,请参考以下文章
Android车载应用开发与分析- 车载多媒体- 多媒体应用架构与MediaSession框架
聊聊高并发(四十)解析java.util.concurrent各个组件(十六) ThreadPoolExecutor源代码分析