Video 如何生成;mdat之前的moov“;MP4视频文件是否具有高性能(最低I/O)?

Video 如何生成;mdat之前的moov“;MP4视频文件是否具有高性能(最低I/O)?,video,video-streaming,mp4,Video,Video Streaming,Mp4,我正在设计一个服务器应用程序,它将一个实时的H.264视频流存储为MP4,供浏览器以后使用。由于服务器将需要处理尽可能多的并发流,我相信I/O将是自然的瓶颈,我希望将I/O保持在最低限度。我遇到了经典的MP4 moov/mdat排序问题:MP4生成器更喜欢先写入mdat框(包含实际的媒体帧),然后在实际知道mdat文件偏移量是什么之后再写入moov框(包含文件偏移量和其他结构信息)。MP4的消费者更喜欢渐进式流媒体播放的相反方式——首先读取moov框,这样就知道了mdat结构,视频就可以快速播放

我正在设计一个服务器应用程序,它将一个实时的H.264视频流存储为MP4,供浏览器以后使用。由于服务器将需要处理尽可能多的并发流,我相信I/O将是自然的瓶颈,我希望将I/O保持在最低限度。我遇到了经典的MP4 moov/mdat排序问题:MP4生成器更喜欢先写入mdat框(包含实际的媒体帧),然后在实际知道mdat文件偏移量是什么之后再写入moov框(包含文件偏移量和其他结构信息)。MP4的消费者更喜欢渐进式流媒体播放的相反方式——首先读取moov框,这样就知道了mdat结构,视频就可以快速播放,而无需下载整个文件

通常的解决方案是对MP4文件进行后处理,将moov框移到mdat框之前,并相应地重写文件偏移量。但是,对于大容量应用程序,我希望避免将传入的视频数据写入磁盘、将其全部读回并使用新的安排再次写入的I/O惩罚

我想到了几种方法:

  • 如往常一样对MP4进行后期处理,会导致I/O损失,并可能延迟视频的可用性。(不太好。)
  • 使用碎片化的MP4和适合内存的小碎片大小。(我认为,这可能会对整个文件的可查找性产生负面影响。)
  • 如果文件系统提供了一个快速的“prepend”选项,将新块添加到文件块链的开头,那就太棒了。(我认为这还没有被发明出来。)
  • 将MP4生成为两个文件——“mdat”文件(包含实际媒体帧)和“moov”文件(包含ftyp头和moov数据)。如果将这两个文件连接起来,将生成一个有效的moov第一个MP4文件。一个简单的web服务器模块可以向用户呈现一个虚拟的.mp4文件,但可以在后台读取.moov和.mdat文件

  • 我现在倾向于4。有没有更实用的方法来解决这个问题?

    如果moov数据的大小是可估计的,请在文件的开头预先分配空间。其中一些可能会被浪费,但您不必重新计算任何偏移量,而且在某些情况下,它将避免I/O成本。只要确保当moov数据大于您的估计值时,您有一个后备方案。

    这是一个很好的建议,我认为在输入具有稳定/已知特征(有界持续时间和GOP大小,以及一致的帧速率)的情况下,它会很好地工作。事实上,FFmpeg的MP4多路复用器对此有一个选项(“moov_大小”)。(尽管没有溢出意外情况。)如果适度的moov保留在90%的时间内是足够的,而重写费用只在10%的时间内发生,这可能是一个合理的权衡。我认为需要对现实世界的输入数据进行一些调查,以找到最佳点。