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

Mediamuxer produces corrupted video when samples are written in batch

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

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

但是,如果我尝试先将这些帧存储在一个数组中,然后再决定将它们发送到多路复用器,那么即使演示时间戳是正确的,我也无法制作出有效的视频。

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

任何人都可以阐明这个问题吗?

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

谢谢mstorsjo and fadden。我实际上遇到了一系列错误,这些错误让我无法理解到底发生了什么。你的两个问题都让我找到了正确的代码,并确信使用 writeSampleData() 时间敏感。

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

此代码(针对 SmartPolicing 项目)的作用是捕获视频和音频以创建 MP4 文件。我可以使用 MediaRecorder(这是最初的解决方案),但我们还想拦截帧并通过网络流式传输视频,因此我们放弃了 MediaRecorder 并创建了一个自定义解决方案。

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