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

mmm*_*aak 5 mp4 android ffmpeg

我有个问题:

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

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

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

Blu*_*doo 5

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

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

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

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

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