当批量写入样本时,Mediamuxer会生成损坏的视频

时间:2016-06-08 15:57:05

标签: android video mediacodec mediamuxer

我正在尝试使用Android的MediaMuxer和MediaCodec来制作MP4视频。

如果我通过调用writeSampleData()将编解码器中的帧直接排到多路复用器,一切正常,并生成正确的视频。

但是,如果我尝试首先将这些帧存储在一个阵列上并稍后决定将它们发送到多路复用器,即使演示时间戳正确,我也无法生成有效的视频。

由于某种原因,似乎mediamuxer输出不仅取决于显示时间戳,还取决于实际调用“writeSampleData”的时间,尽管我的理解是拥有正确的时间戳应该足够了。

有人能解释一下这个问题吗?

2 个答案:

答案 0 :(得分:2)

感谢mstorsjofadden。我实际上有一些错误,这些错误让我无法理解真正发生的事情。你的两个问题都让我得到了正确的代码,并坚信使用writeSampleData()时间敏感。

是的,我第一次收到了错误的缓冲区。问题最初并不明显,因为多路复用器在重写缓冲区之前正在编写帧。当我介绍延迟并决定复制缓冲区内容时,我遇到了另一个问题(基本上是竞争条件),并得出结论并非如此。

此代码的作用(对于SmartPolicing项目)是捕获视频和音频以创建MP4文件。我可以使用MediaRecorder(这是最初的解决方案),但我们也希望拦截帧并通过网络传输视频,因此我们删除了MediaRecorder并创建了自定义解决方案。

现在它运行顺利。非常感谢,伙计们。

答案 1 :(得分:0)

您确定实际存储了要写入的帧的完整数据,而不仅仅是缓冲区索引吗?