MediaExtractor
、MediaCodec
和MediaMuxer
实现的。我需要帮助截取任意音频帧,以便与它们的视频帧对应。我相信必须在解码器输出缓冲区中裁剪音频帧,因为这是可编辑的未压缩音频数据的逻辑位置。
对于输入/输出裁剪,我正在计算原始音频缓冲区的必要偏移和大小调整,以将其装入可用的结尾帧中,并使用以下代码提交数据:
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
似乎存在差异。编码器输入缓冲区难道不是从0到info.size
而不是从info.offset
到(info.offset
+info.size
)吗?也许您经历的时间差正好是0到偏移量之间的数据量? - DavedecoderOutputBuffer
、encoderInputBuffer
和audioEncoder.queueInputBuffer
没有保证会使用相同的size
和offset
值。我尝试了几种组合。我也相信我只是减小了数据的大小,但并没有减小容器的大小。我开始考虑解决方案可能涉及到类似于MediaCodec.BUFFER_FLAG_CODEC_CONFIG
的配置更改。 - David Manpearl