6

我有个问题:

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

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

如何将我自己的 moov 数据写入流中?我可以为此使用 MediaRecorder 吗?还是必须手动进行?如何生成有效的 moov 数据?如果有人已经解决了这个问题,请给我建议..

4

1 回答 1

5

“moov”原子包含播放器解码媒体所需的信息。对于许多格式,没有 moov atom 的 mp4 或 mov 文件就是垃圾。

在大多数情况下,moov 会附加在末尾。这是因为无法提前预测 moov 原子的内容。如果它位于开始位置并不断更新,则没有什么不同。后者的好处是,如果流中断或停止,文件仍然可以播放。换句话说,简单地将它放在开头不会对您有帮助,因为您仍然需要持续更新它。

不幸的是,在处理媒体方面,Android 与 iOS 相去甚远。如果您找到使用 Android 库解决此问题的方法,我会感到惊讶。我特别没有 MediaRecorder 的经验,但 MediaCodec 类对此没有提供任何内容,在简要查看 MediaRecorder 文档后,这里看起来是同样的问题。

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

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

于 2013-03-11T15:13:01.503 回答