• 【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 );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    为生产者添加滤镜

    // 创建马赛克滤镜
    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    附属代码下载链接

    源代码下载链接

    参考资料

    【1】MLT github链接

  • 相关阅读:
    749个看图识字含MP3音频ACCESS\EXCEL数据库
    adb详细教程(四)-使用adb启动应用、关闭应用、清空应用数据、获取设备已安装应用列表
    光谱异常样本检测分析
    stm32学习笔记:中断的应用:对射式红外传感器计次&旋转编码器计次
    springboot+vue+nodejs+java卤菜品销售商城系统
    为什么我的MySQL会抖一下?
    CVPR2022 | 可精简域适应
    【网络安全】网络安全的最后一道防线——“密码”
    排序 (爱思创算法四)(期中测试)(答案记录)
    IceRPC之服务器地址与TLS的安全性->快乐的RPC
  • 原文地址:https://blog.csdn.net/MichaelKongChina/article/details/126307431