0

単一の画像である短いビデオを作成しようとしています。(少しばかげていることは知っていますが、より大きな何かのテストです)。

それをレンダリングするためのコードは次のとおりです。

#include <framework/mlt.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
  if(mlt_factory_init(NULL)) {
    mlt_profile p = mlt_profile_init(NULL);
    mlt_consumer target = mlt_factory_consumer(p, "avformat", 
    mlt_producer source = mlt_factory_producer(p, "hold", "/Users/leif/logo.png");
    mlt_producer_set_in_and_out(source, 0, 10);
    mlt_consumer_connect(target, mlt_producer_service(source));
    mlt_consumer_start(target);

    sleep(5);
    mlt_consumer_stop(target);

    mlt_consumer_close(target);
    mlt_producer_close(source);
    mlt_factory_close();
  } else {
    printf("No\n");
  }

  return 0;
}

このファイルはどこlogo.pngにありますか。

このコードを実行して再生するoutput.mp4と、画像がすべてガーベル化されて表示されます。真ん中に緑のラインがあり、ロゴがかなり重なっています。

一方、コンシューマーを SDL に変更すると、画像は問題なく再生されます。

最後に、コンシューマーを XML に変更し、melt コマンド ライン アプリケーションを使用してレンダリングすると、次のようになります。

melt -consumer avformat:xmlout.mp4 output.xml

ビデオを再生すると、正常に再生されます。

設定する必要がある avformat コンシューマに欠けているものはありますか? それとも私がここで見逃している何か?

編集:参考までに、出力されたxmlファイルは次のとおりoutput.xmlです。

<?xml version="1.0" encoding="utf-8"?>
<mlt LC_NUMERIC="en_US.UTF-8" version="6.2.0" root="/Users/leif/src/video/private" title="Anonymous Submission" parent="producer0" in="0" out="10">
      <profile description="DV/DVD PAL" width="720" height="576" progressive="0" sample_aspect_num="16" sample_aspect_den="15" display_aspect_num="4" display_aspect_den="3" frame_rate_num="25" frame_rate_den="1" colorspace="601"/>
  <producer id="producer0" title="Anonymous Submission" in="0" out="10">
    <property name="length">15000</property>
    <property name="eof">pause</property>
    <property name="resource">/Users/leif/logo.png</property>
    <property name="aspect_ratio">1.06667</property>
    <property name="frame">0</property>
    <property name="method">onefield</property>
    <property name="mlt_service">hold</property>
    <property name="global_feed">1</property>
  </producer>
</mlt>
4

1 に答える 1

2

関連するバグレポートから:

mlt_factory_profile()は、フレームワーク自体がプロデューサーとコンシューマー間の合意を義務付けていないため、実際には少しトリッキーで不明確です。合意を容易にするために一連の正規化フィルターを追加する「ローダー」と呼ばれる MLT スーパー プロデューサーがあります。また、サービス パラメータを mlt_factory_producer() に指定すると、このプロデューサーをバイパスします。上記のリンクされたコードでは、MLT_PRODUCER への参照が表示されます。これには、そのファイルで以前に定義されたデフォルトの「ローダー」があります。

つまり、本当に、物事を機能させるには、次のように言う必要がありますmlt_factory_producer(p, NULL, "hold:/Users/leif/logo.png");

XML については、producer_xml.cがまさにそれを行っていることを確認してください。

于 2016-10-14T21:44:45.233 に答える