我正在开发在线电视服务。目标之一是在没有任何其他浏览器插件(Flash 除外)的情况下播放视频。
我决定使用 MP4,因为大多数 HTML5 浏览器和 Flash(作为后备)都支持它。这些视频由 FFMpeg 在服务器上从 ASF 转码。
但是,我发现 MP4 不能实时流式传输,因为它有一个 moov atom 用于必须指定长度的元数据。FFMpeg 不能直接将 mp4 流式传输到标准输出,因为它将 moov 放在文件末尾。(MP4 的实时转码和流式传输在 Android 中有效,但在 Flash 播放器中失败并出现 NetStream.Play.FileStructureInvalid 错误)
当然,MPEG-TS 是存在的,但它不受 HTML5 支持<video>
。
我想到的是一种将流实时转码为 MP4 的方法,并且在每个新的 HTTP 请求上,首先发送一个 moov 指定一个非常长的视频长度数字,然后开始发送其余的MP4 文件。
是否可以以这种方式使用 MP4 进行流式传输?
经过一些研究和av501的回答,我明白必须知道框架的大小才能工作。
可以将 mp4 文件分割成更小的部分以便进行流式传输吗?
当然,切换到另一种容器/格式是一种选择,但与 Flash 和 HTML5 兼容的唯一格式是 mp4/h264,所以如果我必须同时支持两者,我必须转码两次。