使用HTTP流传输MP4文件而无需分段

4

我想要实现MP4的流媒体播放。

如果你要流媒体播放MP3,可以通过RTMP或IceCast等工具将其传输到某个地方,并通过HTTP观看(但没有HLS)。直播MP3文件的格式大致是这样的:http://example.com/live.mp3。在此处可以收听生成的实时MP3。

现在我希望用类似的方式处理MP4。我想将MP4(AVC/H.264)流式传输到服务器上(可能通过RTMP),并想在此位置接收直播流:http://example.com/live.mp4。我不想使用HLS(它有M3U8文件和TS文件)。

这种情况可行吗?

我知道对于已经生成的MP4,将其转换为FastStart/WebOptimised MP4之后可以实现,但我需要的是一个实时MP4。


视频中是否包括声音?如果是无声的(例如来自闭路电视安全摄像头),可能有解决方案。 - VC.One
视频有声音。 - Ben van Hartingsveldt 'Y'
@VC.One,如果我问一下没有声音的情况下你的解决方案会是什么? - Harry
1
@Harry 我的想法是直接流传原始的h.264数据/帧,而不涉及MP4容器。这类似于实时流传MP3帧(例如:对于“LIVE”流,您不会将MP3数据放入MP4容器中,因此也不要为视频这样做)。另一种选择(如果有声音)是使用支持实时流传的容器,如FLV或AVI。我相信JavaScript可以用来读取字节,因此可以从FLV或AVI中提取编解码器数据,并将其馈送到<audio><video>标签中(另请参见:MediaSource扩展)。 - VC.One
1个回答

4
首先,你要比较苹果和香蕉:mp3是一种编解码器,而mp4是一种容器。
如果你只是“流式传输”mp4文件,那么你只会传输二进制数据,而不给解码器任何关于正在查看什么的线索。这就是HLS等技术的用处。
正如你所提到的,为了流式传输mp3,需要像Icecast或rtmp服务器这样的附加组件。如果你想流式传输AVC/AAC,可以使用例如DASH、HLS、rtmp、rtsp、udp以及mpeg2传输流作为容器,你的流媒体就可以准备好了。(大部分内容都基于mpeg2ts)
问题在于客户端需求。如果你希望它与HTML5兼容且跨平台,目前你基本上只能使用HLS或DASH进行实时流媒体传输。
如果接收应用程序与Flash或HTML5不同,最简单的方法之一,而不涉及使用其他流媒体服务器,是使用mpeg2传输流的UDP流媒体传输。
我将添加一个非常简化的图示,以便您了解不同技术的工作原理:

Streaming methods

此外,不断涌现出新的技术,例如我最近的应用程序中使用了WebRTC进行向HTML5浏览器的实时流媒体传输。

理论上,您可以只流式传输.mp4二进制数据,但客户端需要做好充分准备。如果客户端在文件开头没有收到moov原子,则实际上它不再接收mp4流,而只是二进制AVC / AAC流。这基本上就是MPEG DASH的工作方式。它将解码所需的信息与二进制文件块一起存储为单独的文件,以便在一定的短时间内进行访问。

[编辑]正如我刚才遇到的,这里有一个相关的ffmpeg命令:

ffmpeg -i D:\input.mxf -s 640x360 -hls_list_size 30 -hls_flags delete_segments+append_list+omit_endlist -hls_list_size 1 -f hls c:\xampp\htdocs\out.m3u8

然后我下载并提取了这个文件到我的Web服务器根目录: https://github.com/video-dev/hls.js

从那里,我打开了hls.js的演示页面: http://localhost/hls/demo/index.html - 并在那里输入了我的m3u8的URL "http://localhost/out.m3u8",它可以正常播放我的实时视频。无需安装任何浏览器插件 ;-)

来源: Change ffmpeg input on the fly


如果我理解正确的话,我不能使用FastStart MP4进行直播流,而是必须将其分成几个部分。 - Ben van Hartingsveldt 'Y'
是的,文件块始终是这样的情况。与HLS一样,单个块的大小定义了客户端可以跳转到“实时”流的“偏移量”。此外,客户端需要准备好“无缝”播放mp4块... - Harry
1
好的,我认为如果服务器生成一个带有 "moov" 的 MP4 头,并在此之后流式传输所有实时样本和 AvcSamples 在“mdat”中,这是可能的,但如果不可能,我必须使用 HLS 或 MPEG-DASH。 我不知道 HTML5 视频标签是否支持它。 - Ben van Hartingsveldt 'Y'
我邀请你进入DASH聊天室。 - Harry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接