我正在研究 Telegram 机器人 API,它显示了此选项sendVideo
:
支持流 布尔值 选修的
如果上传的视频适合流媒体播放,则传递 True
这表明有些 MPEG-4 视频文件适合流式传输,有些则不适合。这有什么区别?如何确保我的视频文件“适合流式传输”?
答案1
据我所知,MP4 容器文件的元数据(音频/视频轨道、编解码器信息)可能位于文件开头的实际数据之前,也可能位于文件结尾。如果元数据位于文件结尾,播放器在下载完整个文件之前无法解码视频流(除非它可以搜索整个文件,例如,使用 HTTP 范围请求即可实现)。
例如,此文件mdat
之前有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
...
例如参见FFMPEG“快速启动”文章。
此外(我刚刚发现),音轨数据可以与视频数据交错,也可以不交错。如果出于某种原因没有交错,播放器再次需要等待整个音频流下载完毕后才能开始接收视频数据(除非它可以向前/向后搜索)。
也可以看看碎片化、分割、分裂和交织。