2

ffmpeg ライブラリを Android に移植しました。JNI インターフェイスを使用して、コマンド ラインからのように、ffmpeg の main メソッドに引数を与えることで、ffmpeg コマンドを実行できます。

ビデオの特定の部分を取得するには、次のコマンドを使用します。

ffmpeg -i /mnt/sdcard/input_video.mp4 -ss 00:00:12 -t 00:00:10 -an /mnt/sdcard/output_video.mp4

そしてそれはうまくいきます。ビデオは 12. 秒から 22. 秒に分割され、ビデオが保存されます。メソッドは通常どおり (0 として) 戻ります。

ただし、最初の呼び出しが完了した直後に 2 番目の同様の呼び出し (たとえば、異なる開始時間) を行うと、ffmpeg は要求を処理できず、セグメンテーション エラーがスローされます。

最初の呼び出しでは、次のような情報が提供されます。

入力ストリーム #0.0 の推測チャンネル レイアウト: モノラル

そして動作します。しかし、2 番目のメッセージは次のようになります。

入力ストリーム #1.0 の推測チャンネル レイアウト: モノラル

そしてそれはうまくいきません。エラーと関係があるかどうかはわかりません。

一般に、この問題は静的グローバル変数に関連しているはずですが (私はそう思います)、それらを適切にリセットすることができませんでした。ffmpeg の main メソッドへの呼び出しを複数回成功させるための解決策は何ですか?

4

2 に答える 2

1

https://github.com/jhotovy/android-ffmpeg

同じアクティビティから ffmpeg の main() を複数回呼び出すと、segfault が発生します。これはまだ libffmpeg の問題ですが、libffmpeginvoke は少なくともここで説明されている一時的な解決策を適用します:アクティビティでサードパーティ ライブラリのネイティブ メソッドを 2 回呼び出すと、Android アプリケーションが閉じます

于 2012-10-10T08:09:50.920 に答える
1

Hiko が作成した github のこの例は、他の人が問題を解決するのに役立ちます。 JNI で ffmpeg を複数回呼び出す

それが行うことは、次のように main() メソッドの冒頭で静的変数を再初期化することです。

int main(int argc, char **argv)
{
    LOGI("start run in main.");
    received_sigterm = 0;
    received_nb_signals = 0;
    transcode_init_done = 0;
    ffmpeg_exited = 0;
    main_return_code = 0;

    run_as_daemon  = 0;
    nb_frames_dup = 0;
    nb_frames_drop = 0;

    nb_input_streams = 0;
    nb_input_files   = 0;
    nb_output_streams = 0;
    nb_output_files   = 0;
    nb_filtergraphs = 0;
    int ret;
    int64_t ti;

    register_exit(ffmpeg_cleanup);
    ............................................
    ............................................
    ........... The rest of the code ...........

これらの行を追加することで、セグメンテーション違反が二度と発生しなくなります。

于 2016-03-27T15:37:31.400 に答える