1

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

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

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

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

任何人都可以对这个问题有所了解吗?

4

2 回答 2

2

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

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

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

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

于 2016-06-09T21:26:25.640 回答
0

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

于 2016-06-08T18:35:08.667 回答