Android MeidaRecorder中的Moov原子记录了数据

时间:2013-03-11 12:36:42

标签: android ffmpeg mp4

我遇到了问题:

我在Android应用中使用MediaRecorder记录来自相机的数据。我把它保存在socket中,而不是保存在文件中。该数据的长度可能不同。在套接字连接的另一端,我将其保存在文件中。连接可能会在任何意外时刻中断。因此,在android套接字断开后,我尝试使用ffmpeg解码接收的数据。但据我所知,它无法在此文件中找到moov原子。我已经阅读了一些关于moov的信息,所以我认为MediaRecorder将moov atom放在文件末尾。但如果录音中断,则跳过写moov原子。

我还读过,对于长度未知的数据(渐进式加载,流式传输),可以在文件的开头写入moov atom。

如何将自己的moov数据写入流中?我可以使用MediaRecorder吗?或者有必要手工制作吗?如何生成有效的moov数据?如果有人已经解决了这个问题,请给我建议..

1 个答案:

答案 0 :(得分:5)

'moov'原子包含玩家解码媒体所需的信息。对于许多格式,没有moov原子的mp4或mov文件只是垃圾。

在大多数情况下,最后附加moov。这是因为莫夫原子的含量不能提前预测。如果它位于开始并连续更新,则没有区别。后者的好处是,如果流被中断或停止,文件仍然可以播放。换句话说,简单地将它放在开头对你没有帮助,因为你仍然需要不断更新它。

不幸的是,Android在处理媒体方面远不及iOS。如果您找到使用Android库解决此问题的方法,我会感到惊讶。我没有特别喜欢MediaRecorder的经验,但是MediaCodec类没有提供任何内容,在简要介绍了MediaRecorder文档之后,它看起来像是同样的问题。

现在...... h264流可以在没有mp4标头的情况下播放,因为它包含了自己的一些元数据。这将允许套接字另一侧的应用程序仍然使用数据。您可以使用ffmpeg来获取适用于Android的内容。只需将字节写入扩展名为.h264的文件,然后在传输完成后将其复用到mp4文件中。如果你有音频,那就相同。

编辑:如果你不能发送原始的h264数据,那么你会在mp4文件的'mdat'原子中找到它,但是你需要单独处理音频,否则你将无法分辨音频和视频分开。