首先,你要比较苹果和香蕉: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](https://istack.dev59.com/flPuc.webp)
此外,不断涌现出新的技术,例如我最近的应用程序中使用了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
<audio>
或<video>
标签中(另请参见:MediaSource扩展)。 - VC.One