MLTMLT多媒体框架生产消费架构解析

Posted 一二三o-0-O

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MLTMLT多媒体框架生产消费架构解析相关的知识,希望对你有一定的参考价值。

MLT多媒体框架生产消费架构解析

前提

  1. 通过阅读【MLT】MLT多媒体框架生产消费架构解析(一)满足以下两点:
    1. 了解MLT的核心C++封装的层级关系
    2. 掌握使用MLT的Consumer(sdl)消费Producer(MP4)
  2. 通过阅读【MLT】MLT多媒体框架生产消费架构解析(二)满足以下两点:
    1. 了解Service(服务抽象基类)与 Filter(滤镜抽象服务类)
    2. 掌握为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(马赛克)效果

  1. 滤镜只对width设置
  2. 滤镜只对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多媒体框架生产消费架构解析的主要内容,如果未能解决你的问题,请参考以下文章

架构师养成记--15.Disruptor并发框架

java开发转技术支持,含答案解析

java自学网址,源码+原理+手写框架

Android车载应用开发与分析- 车载多媒体- 多媒体应用架构与MediaSession框架

最强解析面试题:Goland 消费生产模式实现

聊聊高并发(四十)解析java.util.concurrent各个组件(十六) ThreadPoolExecutor源代码分析