Androidでビデオファイルをフレーム精度で整える機能を構築しています。トランスコードは、MediaExtractor
,MediaCodec
、およびMediaMuxer
で実装されています。私はビデオフレームの対応するものと一致させるために任意のオーディオフレームを切り捨てる助けが必要です。Android MediaCodec正確なトリムをフレームする方法
オーディオフレームは、非圧縮オーディオデータを編集できる論理的な場所であるデコーダ出力バッファでトリムする必要があります。
/アウトトリムに私は計算していますのために必要なオフセットと生のオーディオバッファにサイズ調整が可能なエンドキャップフレームにそれを押し込もする、と私は、次のコードを使用してデータを提出しています:
MediaCodec.BufferInfo info = pendingAudioDecoderOutputBufferInfos.poll();
...
ByteBuffer decoderOutputBuffer = audioDecoder.getOutputBuffer(decoderIndex).duplicate();
decoderOutputBuffer.position(info.offset);
decoderOutputBuffer.limit(info.offset + info.size);
encoderInputBuffer.position(0);
encoderInputBuffer.put(decoderOutputBuffer);
info.flags |= MediaCodec.BUFFER_FLAG_END_OF_STREAM;
audioEncoder.queueInputBuffer(encoderIndex, info.offset, info.size, presentationTime, info.flags);
audioDecoder.releaseOutputBuffer(decoderIndex, false);
私の問題は、データ調整が出力オーディオバッファにコピーされたデータだけに影響するように見えますが、MediaMuxer
に書き込まれるオーディオフレームを短くしないことです。出力ビデオは、クリップの最後に数ミリ秒の欠落したオーディオで終わるか、あまりにも多くのデータを書き込むと、オーディオフレームはクリップの最後から完全に落ちます。
オーディオフレームを正しくトリミングする方法は?
私が正しく理解していれば、 'queueInputBuffer'を呼び出すときに' info.offset'を使用することに矛盾があるようです。エンコーダの入力バッファが(info.offset' + 'info.size')に' info.offset'ではなく 'info.size'から0まで実行されていませんか?おそらく、あなたが経験する時間差は正確に0とオフセットの間のデータの量ですか? – Dave
@Dave私はあなたが正しいと信じています。 'decoderOutputBuffer'、' encoderInputBuffer'、 'audioEncoder.queueInputBuffer'がすべて同じ' size'と 'offset'値を使うという保証はありません。私はいくつかの組み合わせを試みました。私はまた、データのサイズだけを減らしていると思いますが、コンテナは縮小していません。私は解決策が 'MediaCodec.BUFFER_FLAG_CODEC_CONFIG'の設定変更に似たものを含むかもしれないと考え始めました。 –