我搜索了几个小时.. 我只想要一个有效的解码/编码录制的电影。 这在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
感谢您的帮助, 菲利克斯
答案 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_RATE
和KEY_I_FRAME_INTERVAL
值对您没有帮助 - 它们在配置编码器时设置,并且不会影响帧时序。