android 4.1中的捕获缓冲区到缓冲区编码/解码(API 16)

时间:2015-11-30 00:29:22

标签: android mediacodec mediaextractor

我搜索了几个小时.. 我只想要一个有效的解码/编码录制的电影。 这在Android 4.1上甚至可能吗? 现在我只为我的mp4文件写了几个kb。没有错误。

在此之后,我将使用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

感谢您的帮助, 菲利克斯

1 个答案:

答案 0 :(得分:2)

bigflake提供了一些其他信息。特别是FAQ item #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_RATEKEY_I_FRAME_INTERVAL值对您没有帮助 - 它们在配置编码器时设置,并且不会影响帧时序。