4

Android でビデオ ファイルをフレーム単位で正確にトリミングする機能を構築しています。トランスコーディングはMediaExtractor、 、MediaCodec、およびで実装されMediaMuxerます。対応するビデオ フレームと一致させるために、任意のオーディオ フレームを切り捨てる方法を教えてください。

オーディオ フレームは Decoder の出力バッファでトリミングする必要があると思います。これは、圧縮されていないオーディオ データを編集できる論理的な場所です。

イン/アウト トリムについては、未加工のオーディオ バッファに必要なオフセットとサイズの調整を計算して、使用可能なエンドキャップ フレームに押し込み、次のコードを使用してデータを送信しています。

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です。出力ビデオは、クリップの最後に数ミリ秒のオーディオが欠落してしまうか、またはあまりにも多くのデータを書き込んだ場合、オーディオ フレームがクリップの最後から完全にドロップされます。

オーディオ フレームを適切にトリミングするには?

4

1 に答える 1