0

最初ははっきりしなかったので編集してください:

Android MediaCodec を使用して、既存のビデオ ファイル (videoBefore.MP4) から各フレームを取得し、フレームを処理し (ぼかしのように)、各フレームを新しいビデオ ファイル (videoAfter.MP4) にエンコードしようとしています。
新しい動画は、最初の動画と同じ長さにする必要があります。

たった 1 つの条件:
すべてのフレームは無制限の時間で処理する必要があります。つまり、10 秒のビデオの処理に 1 分かかる可能性があります。

これまでのところ、リアルタイムで実行できる迅速な処理 (ブルー シフトなど) の例だけを見てきました。
ビデオからフレームを取得し、それを処理するために「時間をかけて」、同じフレームレートまたはフレームタイミングで新しいビデオを保持する方法はありますか?

*オーディオも保存できればもっと良いかもしれませんが、フレームが重要です。

ありがとう!

4

1 に答える 1

1

あなたは好きなだけ取ることができます。フレームのタイミングは、コードがアクセスされる速度ではなく、.mp4 ファイルに埋め込まれたプレゼンテーション タイム スタンプによって決まります。

から各フレームの時間値を取得し、MediaExtractor#getSampleTime()それをデコーダの に渡し、デコーダの出力バッファに関連付けられqueueInputBuffer()た構造体で受け取ります。BufferInfo処理を行ってフレームをエンコーダに送信し、 でタイム スタンプを再度指定しqueueInputBuffer()ます。これはBufferInfoエンコーダの出力側に渡され、全体BufferInfoを に渡すだけMediaMuxer#writeSampleData()です。

ExtractMpegFramesTestで抽出側を、EncodeAndMuxTestで多重化側を確認できます。DecodeEditEncodeTestは、タイム スタンプを保持してエンコード/デコードを行いMediaExtractorますが、または使用法は示しませんMediaMuxer

コーデックはタイムスタンプをあまり気にしないことに注意してください。気にするのは、.mp4 ファイルを処理するエクストラクタ/マルチプレクサ コードだけです。値は、一部は便宜上、一部はエンコードされたフレームが順不同で表示される可能性があるため、コーデックを介して渡されます。(デコードされたフレーム、つまりデコーダから出力されるものは、常に順序どおりです。)

プレゼンテーション時間を守らないと、ビデオが 0 秒しか続かない (そしてあまり面白くない) か、非常に長時間続くビデオになる可能性があります。Android 4.4 で導入されたscreenrecordコマンドは、タイム スタンプを使用して、画面が更新されていないときにフレームを記録しないようにします。

于 2013-12-02T15:57:40.317 に答える