我正在构建在 Android 上精确修剪视频文件的功能。转码是用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
. 输出视频要么在剪辑末尾丢失几毫秒的音频,要么如果我写入太多数据,音频帧会从剪辑末尾完全丢弃。
如何正确修剪音频帧?