私は、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ビットのビルドも試みました。 はその後、私は、次の構成及びコンパイラ試みた:
- のWindows 7、MSYS2、GCC 7.1.0を32ビットと64ビット
- Windows 7は、MinGWの(Qtのインストーラ)5.3.0 32ビット 最後の1が機能しなかったという事実は驚くべきことである、私は薄いなり https://www.shotcut.org/notes/cross-compile/
- のWindows 7、Shotcut構築済みSDK https://www.shotcut.org/notes/windowsdev/
次コンパイル
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;
}
ねえセルゲイ、答えてくれてありがとう。コピーして貼り付けエラーを作りました。これを修正しました(プロデューサ変数とコンシューマ変数を入れ替えました)。また、私はポインタが有効であることを確認するためにgdbの中でこのコードを実行していたので、コード内のヌルポインタをチェックしていませんでした。私はいくつかのチェックを追加する元の質問にいくつかの編集を加えました。私はまだ問題を抱えています。 – james2048
@ james2048あなたのコードにもうないので、今は別の問題が発生しています。私は[Arch上のMLTのデフォルトパッケージ](https://www.archlinux.org/packages/extra/x86_64/mlt/)を実行していて、編集した例は正常に動作し、赤色のウィンドウが表示されます。 WindowsとUbuntuでコンパイルしたときに同じ問題が発生していますか?すべての依存関係をインストールしてもよろしいですか?出力を与える場合は、問題の場所を特定する方が簡単です。これまで私はこの問題を再現することができません。また、この答えは意味をなさないので、コードが編集されているという質問にメモを付けるべきでしょう。 –
ねえ、セルゲイ、私は質問を編集したことに注意しました。申し訳ありません。申し訳ありませんが、明白ではない場合でも、コードはコンパイルされ、Linux(Ubuntu)上で正常に動作しますが、問題はWindows上で発生します。 – james2048