Ivo*_*Ivo 34 streaming mp4 mpeg h.264 mpeg-4
我正在从事在线电视服务.其中一个目标是在没有任何其他浏览器插件的情况下播放视频(Flash除外).
我决定使用MP4,因为大多数HTML5浏览器和Flash支持它(用于后备).视频由FFMpeg在服务器上从ASF转码.
但是,我发现MP4不能实时流式传输,因为它有一个moov原子用于必须指定长度的元数据.FFMpeg无法直接将mp4流式传输到stdout,因为它将moov放在文件的末尾.(MP4的实时转码和流式传输在Android中有效,但在Flash Player中无法使用NetStream.Play.FileStructureInvalid错误)
当然,MPEG-TS存在,但HTML5不支持<video>.
我想到的是一种将流实时转码为MP4的方法,并且在每个新的HTTP请求中,首先发送一个指定视频长度非常长的数字的moov,然后开始发送其余的MP4文件.
是否可以使用MP4进行流式传输?
经过一些研究和av501的回答,我知道框架的尺寸必须是已知的,以便它可以工作.
mp4文件可以分割成更小的部分,以便可以流式传输吗?
当然,切换到另一个容器/格式是一个选项,但唯一兼容Flash和HTML5的格式是mp4/h264,所以如果我必须支持两者,我必须转码两次.
Seb*_*ies 20
您可以使用碎片MP4.碎片化的MP4文件构建如下:
moov [moof mdat]+
Run Code Online (Sandbox Code Playgroud)
然后,moov框仅包含有关轨道的基本信息(有多少,它们的类型,编解码器初始化等),但没有关于轨道中样本的信息.有关样本位置和样本大小的信息位于moof框中,每个moof框后面跟一个mdat,其中包含前面moof框中描述的样本.通常情况下,人们会选择(moof,mdat)对的长度约为2,4或8秒(对此没有规定,但对于大多数使用情况,这些值似乎是合理的).
这是构建无休止的MP4流的方法.
这是我的想法,有些可能是正确的,但另一些则相距甚远。我辩称自己无知,因为没有人真正完整地记录了这个过程,这都是有根据的猜测。
AvAssetWriter 仅编码到文件,似乎没有办法将编码视频存储到内存中。在从后台线程写入文件时读取文件,表示套接字会产生基本流,这本质上是一个 m4v,它是一个包含 h264/acc mdata 的容器,但没有 moov 原子。(换句话说,没有标头)没有苹果提供的播放器可以播放此流,但基于 ffplay 的修改播放器应该能够解码和播放该流。这应该可行,因为 ffplay 使用 libavformat 可以解码基本流,但需要注意的是,由于没有文件长度信息,有些事情必须由播放、DTS 和 PTS 确定,而且播放器无法在文件中查找。
或者,可以使用 m4v 流中的原始 naul 来构建 rtmp 流。
如果您想进一步讨论可以直接联系我。
您如何获取数据。
由于无论如何你都必须在接收端重建文件,我想你可以对它进行分段,Steve Mcfarin 写了一个小 appleSegmentedEcorder 你可以在他的 github 页面上找到,这解决了 moov 原子的一些问题,因为你拥有所有文件信息。
| 归档时间: |
|
| 查看次数: |
38312 次 |
| 最近记录: |