通过 HTTP 流式传输 MP4,无需分段
Stream MP4 over HTTP without segments
我正在尝试播放 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 之后,但我想要一个 LIVE mp4。
首先你比较苹果和香蕉:mp3是一个编解码器,mp4是一个容器。
如果您只是 "stream" 一个 mp4 文件,您将只是流式传输二进制数据,而不会给解码器任何关于它正在查看的内容的线索。这就是 HLS 和 Co. 的用武之地。
正如您提到的,为了流式传输 mp3,需要一些附加功能,例如 Icecast 或 rtmp 服务器。如果你想流式传输 AVC/AAC 也是一样的:你可以使用例如DASH、HLS、rtmp、rtsp、udp 和 mpeg2 传输流作为容器,您的流已准备就绪。 (大部分内容都基于 mpeg2ts)
问题出在客户端要求上。如果你喜欢HTML5兼容和跨平台,目前直播基本只能用HLS或DASH
如果 Receiver 应用程序可能与 Flash 或 HTML5 不同,最简单的方法之一是使用 mpeg2 传输流的 UDP 流,而不意味着使用额外的流服务器.
我将添加一个非常简化的绘图,以便您了解不同技术的工作原理:
此外,不断有新技术出现,例如在我最近的应用程序中,我确实使用 WebRTC 向 HTML5 浏览器进行实时流式传输。
理论上您可以流式传输 .mp4 二进制数据,但客户端需要为此做好充分准备。如果客户端在文件开头没有收到 moov Atom,那么它实际上不再收到 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
然后我下载并解压到我的网络服务器根目录:https://github.com/video-dev/hls.js
从那里我从 hls.js: http://localhost/hls/demo/index.html - and entered the url to my m3u8 "http://localhost/out.m3u8" 打开了演示页面,它播放了我的实时视频。没有在我的浏览器上安装任何插件 ;-)
来源:
我正在尝试播放 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 之后,但我想要一个 LIVE mp4。
首先你比较苹果和香蕉:mp3是一个编解码器,mp4是一个容器。
如果您只是 "stream" 一个 mp4 文件,您将只是流式传输二进制数据,而不会给解码器任何关于它正在查看的内容的线索。这就是 HLS 和 Co. 的用武之地。
正如您提到的,为了流式传输 mp3,需要一些附加功能,例如 Icecast 或 rtmp 服务器。如果你想流式传输 AVC/AAC 也是一样的:你可以使用例如DASH、HLS、rtmp、rtsp、udp 和 mpeg2 传输流作为容器,您的流已准备就绪。 (大部分内容都基于 mpeg2ts)
问题出在客户端要求上。如果你喜欢HTML5兼容和跨平台,目前直播基本只能用HLS或DASH
如果 Receiver 应用程序可能与 Flash 或 HTML5 不同,最简单的方法之一是使用 mpeg2 传输流的 UDP 流,而不意味着使用额外的流服务器.
我将添加一个非常简化的绘图,以便您了解不同技术的工作原理:
此外,不断有新技术出现,例如在我最近的应用程序中,我确实使用 WebRTC 向 HTML5 浏览器进行实时流式传输。
理论上您可以流式传输 .mp4 二进制数据,但客户端需要为此做好充分准备。如果客户端在文件开头没有收到 moov Atom,那么它实际上不再收到 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
然后我下载并解压到我的网络服务器根目录:https://github.com/video-dev/hls.js
从那里我从 hls.js: http://localhost/hls/demo/index.html - and entered the url to my m3u8 "http://localhost/out.m3u8" 打开了演示页面,它播放了我的实时视频。没有在我的浏览器上安装任何插件 ;-)
来源: