4

私の Android アプリケーションでは、MediaCodec を使用して一部のメディアを webm (vp8) 形式でエンコードしています。エンコーディングは期待どおりに機能しています。ただし、時々同期フレームを作成する必要があります。これが私がすることです:

encoder.queueInputBuffer(..., MediaCodec.BUFFER_FLAG_SYNC_FRAME);

コードの後半で、同期フレームを確認します。

encoder.dequeueOutputBuffer(bufferInfo, 0);
boolean isSyncFrame = (bufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME);

問題は、isSyncFrame が真の値を取得しないことです。

エンコーディング設定を間違えているのではないかと思っています。同期フレームを時々作成するようにエンコーダーに指示するより良い方法があるかもしれません。

MediaCodec のバグでないことを願っています。よろしくお願いいたします。

4

2 に答える 2

5

MediaCodec エンコーダーを使用してオンデマンド同期フレームを要求する (Android 4.3 の時点での) 方法はありません。これは、Android の基礎となるコーデックの実装である OMX が原因の一部であり、同期フレームとしてエンコードする必要がある入力フレームを指定する方法を提供していません。ただし、「近い将来」に同期フレームをトリガーする方法があります。

feisal の回答は、同期フレームを制御するために現在サポートされている唯一の方法ですが、構成時に行う必要があります。

== re: jesup を編集

MediaCodec.setParameter を使用して、近い将来に同期フレームをトリガーできます。

Bundle params = new Bundle();
params.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0);

mCodec.setParameters(syncFrame);

残念ながら、MediaCodec でエンコードされたバッファが同期フレームであるかどうかを判断する (信頼できる) 方法は、バイトコードを調べて自分で行う以外にありません。

于 2013-10-16T00:14:15.690 に答える
1

setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, int secs_between_iframes ); によって、エンコーダーの MediaFormat オブジェクトで I フレームのレートを設定できます。

于 2013-10-15T06:56:49.090 に答える