Mediamuxer 在批量写入示例时生成损坏的视频



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

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

但是,如果我尝试先将这些帧存储在数组上,然后再决定将它们发送到复用器,即使演示时间戳正确,我也无法生成工作视频。

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

谁能阐明这个问题?

谢谢 mstorsjo 和 fadden。我实际上有很多错误,无法让我理解到底发生了什么。你的两个问题都让我找到了正确的代码,并确信使用 writeSampleData() 对时间不敏感。

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

此代码(对于智能警务项目)的作用是捕获视频和音频以创建 MP4 文件。我可以使用MediaRecorder(这是最初的解决方案),但我们也想通过网络插入帧和流式传输视频,所以我们放弃了MediaRecorder并创建了一个自定义解决方案。

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

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