【发布时间】:2016-10-18 15:39:16
【问题描述】:
我正在构建在 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 的音频帧。输出视频要么在剪辑末尾丢失几毫秒的音频,要么如果我写入太多数据,音频帧会从剪辑末尾完全丢弃。
如何正确修剪音频帧?
【问题讨论】:
-
如果我理解正确,当您调用
queueInputBuffer时,使用info.offset似乎存在差异。编码器输入缓冲区不是从 0 运行到info.size而不是info.offset到 (info.offset+info.size) 吗?也许您所经历的时间差异正是 0 和 offset 之间的数据量? -
@Dave 我相信你是对的。不能保证
decoderOutputBuffer、encoderInputBuffer和audioEncoder.queueInputBuffer都将使用相同的size和offset值。我确实尝试了几种组合。我也相信我只是在减少数据的大小,而不是容器。我开始考虑该解决方案可能涉及类似于MediaCodec.BUFFER_FLAG_CODEC_CONFIG的配置更改。
标签: android audio android-mediacodec mediamuxer mediaextractor