我正在尝试使用Android的MediaMuxer和MediaCodec来制作MP4视频。
如果我通过调用 writeSampleData() 将帧从编解码器直接排出到复用器,一切正常,并生成正确的视频。
但是,如果我尝试先将这些帧存储在数组上,然后再决定将它们发送到复用器,即使演示时间戳正确,我也无法生成工作视频。
出于某种原因,mediamuxer 输出似乎不仅取决于演示时间戳,还取决于调用"writeSampleData"的实际时间,尽管我的理解是拥有正确的时间戳就足够了。
谁能阐明这个问题?
谢谢 mstorsjo 和 fadden。我实际上有很多错误,无法让我理解到底发生了什么。你的两个问题都让我找到了正确的代码,并确信使用 writeSampleData() 对时间不敏感。
是的,我第一次得到错误的缓冲区。该问题最初并不明显,因为复用器在重写缓冲区之前正在写入帧。当我引入延迟并决定复制缓冲区内容时,我遇到了另一个问题(基本上是竞争条件)并得出结论,情况并非如此。
此代码(对于智能警务项目)的作用是捕获视频和音频以创建 MP4 文件。我可以使用MediaRecorder(这是最初的解决方案),但我们也想通过网络插入帧和流式传输视频,所以我们放弃了MediaRecorder并创建了一个自定义解决方案。
现在它运行顺利。非常感谢,伙计们。
您确定实际存储了要写入的帧的完整数据,而不仅仅是缓冲区索引吗?