通过MP4直播

时间:2012-10-22 11:29:33

标签: streaming h.264 mp4 mpeg mpeg-4

我正在开展在线电视服务。其中一个目标是在没有任何其他浏览器插件的情况下播放视频(Flash除外)。

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

但是,我发现MP4不能实时流式传输,因为它有一个moov原子用于必须指定长度的元数据。 FFMpeg无法直接将mp4流式传输到stdout,因为它将moov放在文件的末尾。 (Live transcoding and streaming of MP4 works in Android but fails in Flash player with NetStream.Play.FileStructureInvalid error

当然,MPEG-TS存在,但HTML5 <video>不支持。

我想到的是一种将流实时转码为MP4的方法,并且在每个新的HTTP请求中,首先发送一个指定视频长度非常长的数字的moov,以及然后开始发送剩余的MP4文件。

是否可以使用MP4进行流式传输?

经过一些研究和av501的回答,我知道框架的大小必须是已知的,以便它可以工作。

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

当然,切换到另一个容器/格式是一个选项,但唯一兼容Flash和HTML5的格式是mp4 / h264,所以如果我必须支持两者,我必须进行两次转码。< / p>

5 个答案:

答案 0 :(得分:19)

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

moov [moof mdat]+

moov框只包含有关轨道的基本信息(多少,它们的类型,编解码器初始化等),但没有关于轨道中样本的信息。有关样本位置和样本大小的信息位于moof框中,每个moof框后面跟一个mdat,其中包含前面moof框中描述的样本。通常情况下,人们会选择(moof,mdat)对的长度约为2,4或8秒(对此没有规定,但对于大多数使用情况,这些值似乎是合理的)。

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

答案 1 :(得分:4)

这是我的想法,其中一些可能是正确的其他方式。我恳求无知,因为没有人真正记录过这个过程,这是一个有根据的猜测。

AvAssetWriter只编码到一个文件,似乎无法将编码视频转换为内存。在从后台线程写入文件时读取文件以说明套接字会产生基本流,这实际上是一个m4v,它是一个容器,带有h264 / acc mdata,但没有moov原子。 (换句话说,没有标题) 没有苹果提供的播放器可以播放此流,但基于ffplay的修改后的播放器应该能够解码和播放流。这应该工作,因为ffplay使用libavformat可以解码基本流,一个警告,因为没有文件长度信息,一些事情必须由播放,DTS和PTS以及玩家无法在文件中寻找。

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

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

您如何获得数据。

因为无论如何你必须重建接收端的文件,我想你可以把它分段,Steve Mcfarin在他的github页面上写了一个小的appleSegmentedEcorder,这解决了moov的一些问题原子,因为你有所有的文件信息。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

使用qt-faststart或MP4Box将MOOV atom放在文件的开头。 (您还要确保使用H264 Video&amp; AAC Audio编解码器进行通用支持)

希望这有助于你。

答案 4 :(得分:-1)

MP4是MPEG(运动图像专家组)开发的文件格式。它是为国际标准组织创建的,是基于QTFF创建的。在最初的发行版中,MP4与QTFF非常相似。但是,它发展成为一种更高级的文件容器格式。 MP4可以在Apple设备中用于iOS和macOS,而无需重新编码整个视频。与QTFF相比,该文件格式具有很大的优势。它可以通过网络流式传输,而后者则不能。 大多数操作系统和视频编辑工具都支持MP4文件格式。对于同时包含视频和音频的文件,通常的扩展名是.MP4。但是,音频文件仅使用扩展名.M4A。有声读物利用扩展名.M4B,由于代码变化,允许对实际音频文件添加书签。扩展名.M4V用于原始MPEG4视频比特流,而移动电话通常使用扩展名.3G2和.3GP。 Dumpmedia Video Converter是我使用过的最好的转换器。它可以支持许多视频文件格式,例如MP4,MOV,WMV,AVI,MKV,FLV,3GP,MPEG和其他常规视频格式,此处提供了关于how to convert MP4 to AVI的简易指南,您可以单击它来了解更多!