Streaming MP4直播

Streaming MP4直播,streaming,h.264,mp4,mpeg,mpeg-4,Streaming,H.264,Mp4,Mpeg,Mpeg 4,我正在从事一项在线电视服务。目标之一是在不使用任何其他浏览器插件(Flash除外)的情况下播放视频 我决定使用MP4,因为它受到大多数HTML5浏览器和Flash(用于回退)的支持。视频通过FFMpeg从服务器上的ASF转码 但是,我发现MP4不能实时流化,因为它有一个moov atom用于元数据,必须指定长度。FFMpeg不能直接将mp4流式传输到标准输出,因为它将moov放在文件的末尾。 () 当然,MPEG-TS是存在的,但HTML5不支持它 我想到的是一种将流实时转码到MP4的方法,在每

我正在从事一项在线电视服务。目标之一是在不使用任何其他浏览器插件(Flash除外)的情况下播放视频

我决定使用MP4,因为它受到大多数HTML5浏览器和Flash(用于回退)的支持。视频通过FFMpeg从服务器上的ASF转码

但是,我发现MP4不能实时流化,因为它有一个moov atom用于元数据,必须指定长度。FFMpeg不能直接将mp4流式传输到标准输出,因为它将moov放在文件的末尾。 ()

当然,MPEG-TS是存在的,但HTML5不支持它

我想到的是一种将流实时转码到MP4的方法,在每次新的HTTP请求时,首先发送一个moov,指定视频长度的很长数字,然后开始发送MP4文件的其余部分

是否可以使用MP4以这种方式进行流式处理

经过一些研究和av501的回答,我明白了框架的大小必须是已知的,这样它才能工作

mp4文件是否可以分割成更小的部分,以便流式传输


当然,切换到另一个容器/格式是一种选择,但与Flash和HTML5兼容的唯一格式是mp4/h264,因此如果我必须同时支持这两种格式,我必须进行两次转码。

不,这不仅仅是很长的长度。。要在mp4中创建标题,您需要知道每个帧的确切大小。[这就是为什么它最终由各种编码器创建的原因]

伙计们,这是我的想法,有些可能是对的,有些可能是对的。我以无知为借口,因为没有人真正完整地记录这一过程,这完全是一个有根据的猜测

AvAssetWriter只对文件进行编码,似乎无法将编码后的视频存储到内存中。从后台线程读取正在写入的文件时,如果说套接字会产生一个基本流,那么这本质上就是一个m4v,它是一个包含h264/acc mdata的容器,但没有moov原子。(换句话说,没有标题) 没有苹果提供的播放器可以播放此流,但是基于ffplay的改进播放器应该能够解码并播放此流。这应该是可行的,因为ffplay使用libavformat可以解码基本流,有一个警告,因为没有文件长度信息,有些事情必须由播放、DTS和PTS决定,而且播放器不能在文件中查找

或者,可以使用来自m4v流的原始naul来构造rtmp流

如果您想进一步讨论,可以直接与我联系

你是如何获得数据的


“既然你必须在接收端重建文件,我想你可以把它分段,”Steve Mcfarin在他的github页面上写了一个小AppleSegmentedRecorder,这解决了moov atoms的一些问题,因为你有所有的文件信息。

只看你问题的第二段(“视频由ffmpeg从服务器上的ASF转码。”),您提到您正在使用ffmpeg在服务器上转码视频

使用qt faststart或MP4Box将MOOV atom放在文件的开头。(另外,请确保使用H264视频和AAC音频编解码器以获得通用支持)


希望这对您有所帮助。

您可以使用碎片化MP4。碎片化MP4文件的构建如下所示:

moov [moof mdat]+
moov框只包含有关曲目的基本信息(曲目数量、类型、编解码器初始化等)但没有关于轨迹中样本的信息。关于样本位置和样本大小的信息在moof box中,每个moof box后面都有一个mdat,其中包含前面moof box中所述的样本。通常,人们会选择(moof,mdat)-对的长度约为2、4或8秒(没有关于这方面的规范,但是对于大多数用例来说,这些值似乎是合理的)


这是一种构建无休止MP4流的方法。

难道不能让信息为空吗?经过一些调整,我成功创建了一个没有moov atom的m4v文件(基本上是MP4),它在图腾中播放,没有显示任何关于视频长度的信息。您的m4v是MP4(容器)吗包含基本文件还是仅包含基本文件?如果没有标题,则不再兼容。因此,是否播放取决于播放机的智能程度。一些播放机可能会努力工作并尝试修复该文件。但大多数播放机不会播放该文件。是的,似乎m4v可能只是mp4文件或原始h264流。这些文件可以浏览器中的ked是mp4,而ffmpeg生成的是原始流。因此,似乎它根本无法完成。这里有一个很好的解释,开始听起来像rtmp或一些自定义协议是解决方法。你的答案有警告,上面写着。时间是流媒体和播放的问题。所以-1不是。在数字之后在谷歌搜索中,我发现qt faststart被提到了很多——但它不适用于实时流媒体,因为流媒体是连续的——帧/长度从一开始就不知道,因此无法创建MOOV atom。如果我需要的是伪流媒体(连续下载),qt faststart会有所帮助.看看这里:这家伙似乎有一个非常类似的问题。最终,碎片化mp4就像苹果HTTP直播一样,做得很好。一开始我忽略了这一点,因为我认为碎片化似乎是一个不必要的复杂问题,但现在我看到它是唯一的选择。@SebastianAnnies这似乎可行(至少)Safari似乎用一个单独的范围GET请求来请求每个片段(从片段开始到EOF,但过早终止),这使得流的整个处理过程更加麻烦。你有相同的经验吗?