通过MP4流媒体直播(Live streaming through MP4)

2019-06-18 14:32发布

我工作的一个在线电视服务。 目标之一是无需任何额外的浏览器插件播放的视频(除闪存)。

我决定使用MP4,因为它是由广大的HTML5浏览器和由Flash(用于备用)的支持。 这些视频是从ASF由FFmpeg的一个服务器上的转码。

然而,我发现,MP4不能视频直播,因为它有元数据必须指定长度的MOOV原子。 FFmpeg的不能直接流MP4到标准输出,因为它使moov存储在文件的结尾。 ( 现场转码和Android的MP4作品的流,但无法在Flash播放器NetStream.Play.FileStructureInvalid错误 )

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

我想过要转码在实时MP4流的方法,并为它的每个新的HTTP请求,首先发送一个MOOV,指定视频的长度很长的号码,然后开始发送的其余部分MP4文件。

是否有可能使用的MP4流呀?

一些研究和AV501的回答后,我明白,帧的大小必须是已知的,这样它可以工作。

可以在MP4文件分割成更小的部分,这样可以流?

当然,切换到另一个容器/格式是一种选择,但与Flash和HTML5是MP4 / H264的唯一格式兼容,所以如果我要支持,我不得不转码两次。

Answer 1:

这里是我的想法的家伙的一些可能是正确的对他人的方式路要走。 我说不知道,因为没有人真正地完整记录这个过程中,所有的猜测。

AvAssetWriter只编码到一个文件中,似乎有没有办法获得编码的视频内存。 阅读文件,当它被写入到从后台线程说在基本流套接字结果,这基本上是一个M4V,这与H264 / ACC MDATA的容器,但没有MOOV原子。 (换句话说,无标头)没有苹果提供的播放器可以播放此流,但基于ffplay修改的玩家应该能够解码和播放流。 这应该工作,因为由于没有文件长度信息ffplay使用了libavformat能够解码基本流,一个警告,有些事情必须由播放,DTS和PTS,也是玩家来决定的文件中无法寻找。

可替代地从M4V流中的原始naul的可用于构建RTMP流。

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

你如何获得数据。

因为你将不得不重新接收方的文件,无论如何,我猜你可能只是一种细分的话,史蒂夫Mcfarin写了一个小appleSegmentedEcorder你可以找到他的GitHub的页面上,这解决了一些对MOOV原子的问题,因为你拥有所有的文件信息。



Answer 2:

您可以使用零碎的MP4。 支离破碎的MP4文件是建立在如下:

moov [moof mdat]+

MOOV盒则仅包含有关轨道的基本信息(多少,它们的类型,编解码器的初始化等),但没有对在轨道的样本信息。 关于样本位置和样本大小的信息是在MOOF盒,每个MOOF盒之后是包含如前述MOOF盒中描述的样本的mdat。 典型地,一个会选择(MOOF,MDAT)-pair的长度为大约2,4或8秒(有上没有规范,但这些值似乎是合理的最usecases)。

这是构建一个永无止境的MP4流的方式。



Answer 3:

不,这不只是长度非常长..你需要知道每帧的确切大小创造一个MP4头。 [这就是为什么它被由各个编码器在端部产生。



Answer 4:

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

使用Qt-的fastStart或MP4Box放置MOOV原子在文件的开头。 (你也确保使用H264视频和AAC普遍支持的音频编解码器)

希望这有助于你。



文章来源: Live streaming through MP4