2017-07-21 16 views
0

私は、MLTフレームワークを使用していくつかのビデオを処理し連結して評価しています。私はそれを32ビットのC#アプリケーションと統合し、C#データ構造に基づいたデータにいくつかの動的なカスタムオーバーレイを適用する必要があるので、C APIを構築してC#でP/Invokeを使用することを計画していました。Mltフレームワーク - 32ビットWindowsビルドが機能しない

私は、SDL、libavcodec、およびdlfcn-win32、その他のすべてのモジュールを無効にして、https://www.mltframework.org/docs/windowsbuild/に続いてライブラリの最小構成を構築することができました。 しかし、C APIまたはC++ APIを使用している場合、私の32ビットビルドが正しく機能していません。私はsegfaultsを取得し、ダミーの出力ビデオを作成するか、SDLを使用するとハングします。作成されたmelt.exeとexampleプロジェクトのplay.cppも同じ問題を抱えています。

これで私はおそらく32ビットのビルドに問題があると思ったので、同様の結果を得て64ビットのビルドも試みました。 はその後、私は、次の構成及びコンパイラ試みた:

次コンパイル

  • のUbuntu 14.04クロスkそこに私の環境や何か私がやっている間違っている必要があります。私は手紙にその指示に従った。また、起動時にShotcut.exeがクラッシュします。 これらのすべての場合、ビルドは成功しましたが、ビルドされたバイナリは期待どおりに動作しませんでした。

    MLTのC APIがWindows 32ビットでのビデオエンコードで正しく動作するようになった人はいますか?

    私の小さなテストプロジェクトは、https://www.mltframework.org/docs/framework/から順応しています。

    (Sergeyの答えからの懸念の一部を反映するためにこのコードサンプルを編集しましたが、最終結果に変更はありません)。 MLTドキュメントから

    #include <windows.h> 
    #include <stdio.h> 
    #include "include/mlt/framework/mlt.h" 
    
    int main() 
    { 
        mlt_repository repo = mlt_factory_init(NULL); 
    
        fprintf(stderr, "start\n"); 
    
        if (repo != NULL) 
        { 
         mlt_consumer consumer = mlt_factory_consumer(NULL, "sdl", NULL); 
         fprintf(stderr, "Creating consumer %p\n", consumer); 
    
         if (consumer == NULL) 
         { 
          fprintf(stderr, "Consumer NULL. Aborting"); 
          return 1; 
         } 
    
         mlt_producer producer = mlt_factory_producer(NULL, "color", "red"); 
         fprintf(stderr, "Creating producer %p\n", producer); 
    
         if (producer == NULL) 
         { 
          fprintf(stderr, "Producer NULL. Aborting"); 
          return 1; 
         } 
    
         fprintf(stderr, "Connecting %p to %p\n", producer, consumer); 
         mlt_consumer_connect(consumer, mlt_producer_service(producer)); 
    
         fprintf(stderr, "Starting consumer %p\n", consumer); 
         mlt_consumer_start(consumer); 
    
         fprintf(stderr, "Wait for consumer\n"); 
         while (!mlt_consumer_is_stopped(consumer)) 
         { 
          Sleep(1000); 
          fprintf(stderr, "Wait more for consumer...\n"); 
         } 
    
    
         fprintf(stderr, "Close consumer\n"); 
         // Close the consumer 
         mlt_consumer_close(consumer); 
    
         fprintf(stderr, "Close producer\n"); 
         // Close the producer 
         mlt_producer_close(producer); 
    
         fprintf(stderr, "Close factory\n"); 
         // Close the factory 
         mlt_factory_close(); 
        } 
        else 
        { 
         // Report an error during initialisation 
         fprintf(stderr, "Unable to locate factory modules\n"); 
        } 
    
        return 0; 
    } 
    
  • 答えて

    0

    私は問題を解決しました。何が渡されていない場合、Windows上のデフォルトのmlt_profileが作成されないバグがあり

    ので、明示的に作成し、工場出荷時の呼び出しにそれを渡します。

    mlt_profile profile = mlt_profile_init(NULL);

    これはと私の問題を修正しましたWindows上のC API。 いいえ、何らかの理由でSDLが動作しません。しかしそれはそれほど重要ではありません。

    0

    :mlt_factory_consumer(mlt_profile、constのchar型*、CONST void *型)

    mlt_consumer
    はあなたが値をチェックしていないリポジトリ

    から消費者を取得しますmlt_factory_consumerによって返され、NULLです。

    mlt_consumer hello = mlt_factory_consumer(NULL, "color", "red"); 
    printf("Created consumer %p\n", hello); 
    
    mlt_producer world = mlt_factory_producer(NULL, NULL, NULL); 
    printf("Created producer %p\n", world); 
    
    mlt_service service = mlt_producer_service (world); 
    printf("Created service %p\n", service); 
    
    > gcc test.c -lmlt -g && ./a.out 
    
    Created consumer (nil) 
    Created producer (nil) 
    Created service (nil) 
    Segmentation fault (core dumped) 
    

    デフォルト引数が与えられたとき、それが有効なポインタを返すのに対し:

    mlt_consumer hello = mlt_factory_consumer(NULL, NULL, NULL); 
    printf("Created consumer %p\n", hello); 
    printf("Loop over parent %p\n", hello -> parent . child); 
    . . . 
    
    > gcc test.c -lmlt -g && ./a.out 
    
    Created consumer 0x561978461cf0 
    Loop over parent 0x561978461cf0 
    Created producer (nil) 
    Created service (nil) 
    Connected 0 
    Starting consumer 0 
    Wait for consumer 
    Wait more for consumer... 
    Wait more for consumer... 
    
        CTRL-C 
    
    Close consumer 
    Close producer 
    Close factory 
    

    screenshot

    あなたが提供したリンクから:

    デフォルトのコンシューマはsdlです。また、次のようにデフォルトを上書きすることもできます。

    MLT_CONSUMER=xml ./hello file.aviはstdoutにXMLドキュメントを作成します。

    MLT_CONSUMER=xml MLT_PRODUCER=avformat ./hello file.aviは、avformatプロデューサを使用してビデオを直接再生するため、 は正規化機能をバイパスします。

    MLT_CONSUMER=libdv ./hello file.avi > /dev/dv1394あなたが運が良ければ、file.aviのDVへのリアルタイム変換を実行し、DVデバイスにブロードキャストする可能性があります。

    (あなたが希望する場合、デフォルトの消費者をオーバーライドする)あなたは有効な引数またはNULLmlt_factory_consumerを提供する必要があることは明らかである:

    mlt_consumer hello = mlt_factory_consumer(NULL, "xml", NULL); 
    printf("Created consumer %p\n", hello); 
    . . . 
    
    > gcc test.c -lmlt -g && ./a.out 
    
    Created consumer 0x55ab3ceb7660 
    Loop over parent 0x55ab3ceb7660 
    Created producer (nil) 
    Created service (nil) 
    Connected 0 
    Starting consumer 0 
    Wait for consumer 
    Close consumer 
    Close producer 
    Close factory 
    
    +0

    ねえセルゲイ、答えてくれてありがとう。コピーして貼り付けエラーを作りました。これを修正しました(プロデューサ変数とコンシューマ変数を入れ替えました)。また、私はポインタが有効であることを確認するためにgdbの中でこのコードを実行していたので、コード内のヌルポインタをチェックしていませんでした。私はいくつかのチェックを追加する元の質問にいくつかの編集を加えました。私はまだ問題を抱えています。 – james2048

    +0

    @ james2048あなたのコードにもうないので、今は別の問題が発生しています。私は[Arch上のMLTのデフォルトパッケージ](https://www.archlinux.org/packages/extra/x86_64/mlt/)を実行していて、編集した例は正常に動作し、赤色のウィンドウが表示されます。 WindowsとUbuntuでコンパイルしたときに同じ問題が発生していますか?すべての依存関係をインストールしてもよろしいですか?出力を与える場合は、問題の場所を特定する方が簡単です。これまで私はこの問題を再現することができません。また、この答えは意味をなさないので、コードが編集されているという質問にメモを付けるべきでしょう。 –

    +0

    ねえ、セルゲイ、私は質問を編集したことに注意しました。申し訳ありません。申し訳ありませんが、明白ではない場合でも、コードはコンパイルされ、Linux(Ubuntu)上で正常に動作しますが、問題はWindows上で発生します。 – james2048

    関連する問題