3

我搜索了几个小时..我只想对录制的电影进行有效的解码/编码。这在 android 4.1 上是否可行?现在我只将几 kb 写入我的 mp4 文件。没有错误。

在这工作之后,我将使用 KEY_FRAME_RATE 和 KEY_I_FRAME_INTERVAL 将其置于慢动作中。

我使用 mediaExtractor 来配置 MediaCodec。我看到 3 个步骤(完整代码请参阅要点):

1./

encoder.dequeueInputBuffer(5000);
extractor.readSampleData(inputBuf, offset);
ptsUsec2 = extractor.getSampleTime();
encoder.queueInputBuffer(inputBufIndex, ...);

2./

encoder.dequeueOutputBuffer(info, 5000);
ByteBuffer encodedData = encoderOutputBuffers[encoderStatus];
//i write encodedData to a FileOutputStream (to save the MP4);
decoder.queueInputBuffer(inputBufIndex, ...);

3./

decoder.dequeueOutputBuffer(info, 5000);
decoder.releaseOutputBuffer(decoderStatus, ...);

这是我从谷歌的 EncodeDecodeTest 文件中修改的完整函数: gist

谢谢你的帮助,菲利克斯

4

1 回答 1

2

bigflake上提供了一些附加信息。特别是常见问题项目 #9

来自 MediaCodec 解码器的帧格式不保证有用。许多流行的设备将数据解码为专有的 YUV 格式,这就是为什么checkFrame()缓冲区到缓冲区测试中的函数不能始终验证结果的原因。您希望 MediaCodec 编码器能够接受解码器输出的帧,但这不能保证。

针对 API 18+ 进行编码通常要容易得多,因为您可以使用 Surface 而不是 ByteBuffer。

当然,如果你想要的只是慢动作视频,你不需要对 H.264 流进行解码和重新编码。您需要做的就是更改 .mp4 包装器中的演示时间戳。在 API 18+ 上,您可以使用 MediaExtractor 提取并立即使用 MediaMuxer 进行编码,而完全不涉及 MediaCodec。在 API 16 上,MediaMuxer 不存在,因此您需要其他方式将 H.264 包装为 .mp4。

当然,除非您对可变帧率视频有一些反感,在这种情况下,您需要使用重复的“慢动作”帧(并适当调整时间戳)对其进行重新编码。KEY_FRAME_RATE和值对KEY_I_FRAME_INTERVAL您没有帮助——它们是在配置编码器时设置的,对帧时序没有影响。

于 2015-11-30T01:07:50.277 回答