【MLT】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链接

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 34
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一二三o-0-O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值