MLT マルチメディア フレームワークの生産と消費のアーキテクチャの分析
前提
- [MLT] MLT Multimedia Framework Production and Consumption Architecture の分析 (1) を読むと、次の 2 点が満たされます。
- MLT のコア C++ パッケージの階層関係を理解する
- MLT の Consumer (sdl) を使用してMasterを使用して Producer (MP4) を消費する
- [MLT] MLT マルチメディア フレームワークの生産と消費のアーキテクチャの分析 (2) を読むと、次の 2 点が満たされます。
- Service (サービス抽象基本クラス) と Filter (フィルター抽象サービス クラス) を理解する
- プロデューサーにフィルターを追加するマスター
この記事から何が得られますか?
この記事では、 [MLT] MLT Multimedia Framework Production and Consumption Architecture Analysis (2)に基づいて、プロデューサーにアタッチされたフィルターの幅と高さの属性を次のように変換します。
コアクラス分析
プロパティ
[MLT] MLT マルチメディア フレームワーク (1) の生産および消費アーキテクチャの分析は、生産者 (ビデオ リソースとして初期化) が消費者 (SDL として初期化) によって消費される単純なプロセスを示しています。[MLT] MLT マルチメディア フレームワークの生産と消費のアーキテクチャの分析 (2) (1) では、ビデオ プロデューサーを単純に処理し、ビデオ フィルターを追加します。上の図に示すように、このセクションでは、フィルター設定プロパティの新しいカプセル化を導入します:プロパティ (プロパティ クラス) 。これは、サービスと通信するための一般的なメカニズムを提供し、サービスの状態を操作およびシリアル化できます。このセクションでは、使用するメソッドを簡単に紹介するだけで、プロパティのカプセル化については後で完全に分析します。
// 属性类
// 此类重载了大量的序列化的方法,供各种各样的场景使用
/**
* @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);
鬼の展示
フィルター (モザイク) 効果を変更する
- フィルターは幅のみに設定されています
- フィルターは高さのみに設定されています
コード
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 リンク