我有个问题:
我在Android应用中使用MediaRecorder从相机记录数据。我将其保存在套接字中,而不是文件中。该数据的长度可能不同。在套接字连接的另一端,我将其保存在文件中。连接可能会在任何意外的时刻中断。因此,在android套接字断开连接后,我尝试使用ffmpeg解码接收到的数据。但据我了解,它无法在此文件中找到moov原子。我已经阅读了有关moov的一些信息,所以我认为MediaRecorder将moov atom放在文件的末尾。但是,如果记录中断,则会跳过写moov原子的操作。
我还读过,对于长度未知的数据(渐进式加载,流式传输),可以在文件开头写入moov atom。
如何将自己的moov数据写入流中?我可以使用MediaRecorder吗?还是需要手动进行?如何生成有效的Moov数据?如果有人已经解决了这个问题,请给我建议。
最佳答案
“moov”原子包含播放器解码媒体所需的信息。对于许多格式,没有moov原子的mp4或mov文件只是垃圾。
在大多数情况下,moov会附加在末尾。这是因为无法提前预测moov原子的含量。如果它位于开始位置并不断更新,则没有什么不同。后者的好处是,如果流被中断或停止,文件仍然可以播放。换句话说,仅将其放在开始位置就无济于事,因为您仍然需要不断对其进行更新。
不幸的是,在处理媒体方面,Android远不及iOS。如果您找到使用Android库解决此问题的方法,我会感到惊讶。我没有特别的MediaRecorder经验,但是MediaCodec类对此没有任何帮助,在简要浏览MediaRecorder文档后,这里看起来就像是同一问题。
现在... h264流可以在没有mp4头的情况下播放,因为它包含一些自己的元数据。这样一来,位于套接字另一侧的应用仍可以使用数据。您可以为此使用ffmpeg,该功能可用于Android。只需将字节写到扩展名为.h264的文件中,然后在传输完成后将其多路复用为mp4文件。如果您有音频,那也是一样。
编辑:如果您无法发送原始的h264数据,则可以在mp4文件的'mdat'原子中找到它,但是您需要单独处理音频,否则将无法分辨音频和视频分开。
关于android - android MeidaRecorder中的Moov Atom记录数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15338729/