是什么让 MP4 可以流式传输?

Maa*_*ten 29 mp4 streaming

我正在深入研究 Telegram bot API,它显示了以下选项sendVideo

support_streaming 布尔 可选

如果上传的视频适合流式传输,则传递 True

这表明有些 MPEG-4 视频文件适合流式传输,有些则不适合。有何不同?如何确保我的视频文件“适合流式传输”?

use*_*686 36

据我所知,MP4 容器文件的元数据(音频/视频轨道、编解码器信息)可能位于文件开头、实际数据之前或末尾。如果元数据放置在末尾,则播放器在下载整个内容之前无法解码视频流(除非它可以搜索文件,这可以使用 HTTP 范围请求来实现)。

例如,这个文件有mdatbefore moov,所以它不能按原样流式传输:

$ atomicparsley foo.mp4 -T
Atom ftyp @ 0 of size: 32, ends @ 32
Atom free @ 32 of size: 8, ends @ 40
Atom mdat @ 40 of size: 3280091, ends @ 3280131
Atom moov @ 3280131 of size: 139261, ends @ 3419392
     Atom mvhd @ 3280139 of size: 108, ends @ 3280247
     Atom trak @ 3280247 of size: 57400, ends @ 3337647
         Atom tkhd @ 3280255 of size: 92, ends @ 3280347
     ...
     Atom trak @ 3337647 of size: 81158, ends @ 3418805
         Atom tkhd @ 3337655 of size: 92, ends @ 3337747
     ...
Run Code Online (Sandbox Code Playgroud)

请参见例如FFMPEG“快速入门”文章。

此外(正如我刚刚发现的),音轨数据可以与视频数据交错,也可以不交错。如果由于某种原因没有交错,则播放器在开始接收视频数据之前再次需要等待整个音频流下载完毕(除非它可以向后/向前搜索)。

另请参见分段、分段、分裂和交错

  • moov 原子通常放置在末尾的原因是流式播放问题的反面:播放需要在视频之前知道索引元数据,而生成索引元数据需要对视频进行编码/可用。您无法真正预先生成 moov 原子,因此使视频可流式传输需要在视频编码后移动原子,无论是通过编辑输出还是在编码期间缓冲整个视频。您无法一次性将可流式视频直接写入输出流。 (13认同)
  • @Bob:请注意,其他格式(例如 MKV)可以按顺序写入。如果您在编码过程中播放“ffmpeg”输出,它可以工作,但没有索引,因此播放器必须在文件中向前扫描。我认为它将搜索索引放在末尾或其他位置,或者为其留出空间,但即使没有,也有足够的信息来查找和解复用流(音频和视频)。这就是我几乎总是编码为 MKV 而不是 MP$ 的原因之一,这样我就可以在完成之前看看我是否喜欢每比特率的质量权衡。 (2认同)