在HTML5中通过RTSP或RTP流式传输


150

我正在构建一个Web应用程序,该服务器应从服务器http://lscube.org/projects/feng播放RTSP / RTP流。

HTML5视频/音频标签是否支持rtsp或rtp?如果没有,最简单的解决方案是什么?也许是VLC插件或类似的东西。


video标签不能与RTSP一起使用。我知道,任何浏览器都不会本地实现RTSP。您已经知道,您将需要一个插件。或者使用Chrome和Firefox原生支持的webRTC,您将可以将video标签与某些webRTC逻辑一起使用。如果您尝试从IP摄像机等源进行流传输,请使用Wowza之类的流传输服务(或编写您自己的流传输服务)将RTSP转码为webRTC。这是我对您的建议。
Michael P


我认为您可以使用html5进行流式传输,但是无法流式传输到某个位置。
Salih Karagoz '17

好问题,谢谢。“我相信我们不支持RTSP,仅支持通过videojs-flash的RTMP。” -这是Video.js媒体播放器主要维护者的答案。我研究了主题,但找不到很好的解决方案。
zhibirc

可以使用WebRTC RTCPeerConnection在HTML视频元素中播放RTSP(或更正确地说是RTSP设置的RTP流)。以前在webrtc.live555.com上有一个演示。诀窍将是找到添加了必需的WebRTC DTLS和SRTP机制的RTSP服务器。
sipwiz

Answers:


89

从技术上讲“是”

(但不是真的)

HTML 5的<video>标签与协议无关,它不在乎。您将协议src作为URL的一部分放在属性中。例如:

<video src="rtp://myserver.com/path/to/stream">
    Your browser does not support the VIDEO tag and/or RTP streams.
</video>

或许

<video src="http://myserver.com:1935/path/to/stream/myPlaylist.m3u8">
    Your browser does not support the VIDEO tag and/or RTP streams.
</video>

也就是说,<video>标记的实现是特定于 浏览器的。由于HTML 5尚处于初期阶段,我希望经常更改支持(或缺乏支持)。

根据W3C的HTML5规范(视频元素):

用户代理可以支持任何视频和音频编解码器以及容器格式


3
更新:尝试chrome中的第一种方法并得到GET rtp://239.255.0.1:6970 net::ERR_UNKNOWN_URL_SCHEME。似乎video元素上仅允许使用HTTP [S]方案。
Yan Foto

当然,您永远不会通过HTTP传输视频,而只使用RTP之类的协议吗?这将是在TCP非常慢..
markmnl

7
@markmnl是讽刺吗?(我不能说...我很容易被骗。)几年来,HTTP传输是在网络上传输视频的主要方法。Youtube,Netflix等。这不是一个效率问题,而是简单,防火墙穿越,缓存服务器友好等
斯图汤普森

Netflix使用HTTP流视频吗?讽刺似乎并不是流媒体视频的一种低效方式。
markmnl

6
@markmnl为了后代的缘故,值得一提的是Netflix曾经使用MS Silverlight进行流媒体播放,但不久前就放弃了它。作为自2001年以来一直在流媒体中工作的人,最初看到HTTP接管我感到震惊。现在我在喝库尔援助。在效率至关重要的公司网络中,专用协议RTP是规范,尤其是当可以提供多播等功能时。
斯图·汤普森

55

我认为,问题的实质尚未得到真正回答。不,到目前为止,您无法使用视频标签播放rtsp流。关于链接到Chromium guy的“从不”的其他答案有点误导,因为链接的线程/答案不是直接指Chrome通过视频标签播放rtsp。阅读整个链接的线程,尤其是最底部的注释以及与其他线程的链接。

真正的答案是:不,您不能仅将视频标签放在html 5页面上并播放rtsp。您需要使用某种Javascript库(除非您想与Flash和Silverlight播放器一起玩),才能播放流视频。{IMHO}按照html 5视频讨论和实施的进度,专有视频标准的各个供应商对帮助推动这一进展不感兴趣,因此除非浏览器制造商允许,否则不要指望视频标签易于使用自己来解决问题……还是不可能的。{/ IMHO}


1
好评论高尔夫。我也想做Elben所做的没有成功的事情。
will824 2013年

31

这是一个古老的问题,但是我最近不得不自己做,并且我做了一些工作(因此像我这样的其他响应会节省我一些时间):基本上使用ffmpeg将容器更改为HLS,大多数IPCams流h264以及一些PCM的基本类型,因此请使用类似以下内容:

ffmpeg -v info -i rtsp://ip:port/h264.sdp -c:v copy -c:a copy -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 /var/www/html/test.m3u8

然后将video.jsHLS插件配合使用,可以很好地播放实时流。第二个链接下还有一个jsfiddle示例。

注意:尽管这不是本机支持,但不需要在用户前端上做任何额外的事情。


它为我工作,我已经在使用Videojs,并且此HLS插件使带有m3u8文件的直播频道适用于大多数url(即使不是全部)。
Dheeraj Thedijje

高兴的是,虽然有更多的延迟,但似乎并没有太大帮助。
Pawel K

1
试试这个@Cesar:ffmpeg -v info -rtsp_transport tcp -i rtsp://host:port/[sdp] -c:v copy -c:a copy -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 /var/www/html/test.m3u8
Pawel K

1
@Arter基本上,您需要在服务器上(从命令行)在Linux box或其他远程服务器上运行它。从当前用户角度,您需要有权访问/ var / www / html /文件夹(在本示例中)。您也可以尝试在Windows上借助LAMP堆栈或The Uniform Server(更加精简的解决方案)进行操作
Pawel K,

1
这对我有用。最新的ffmpeg中不推荐使用'hls_wrap'。我对感兴趣的任何人使用了此命令行:ffmpeg.exe -fflags nobuffer -rtsp_transport tcp -i rtsp://[SOURCE] -flags +cgop -g 30 -hls_flags delete_segments [DESTINATION]
DanTheMan '18

19

Chrome永远不会实现对RTSP流的支持。

至少,在Chromium开发的话,在这里

我们永远不会为此增加支持


4
好吧,差不多。Chrome已经支持RTSP流传输,这就是为什么他永远不会为此添加支持;)
Stefan Steiger 2014年

2
不,您无法在chrome中使用它,尝试使用youtube rtsp链接时它不起作用。
IdidntKnewIt 2014年

17

HTML5中提供三种流协议/技术:

实时流式传输,低延迟-WebRTC-Websocket

视频点播和实时流媒体,高延迟-HLS

1. WebRTC

实际上,WebRTC是SRTP(安全RTP协议)。因此,可以说视频标签通过WebRTC间接支持RTP(SRTP)。

因此,要在您的Chrome,Firefox或其他HTML5浏览器上获取RTP流,您需要一个WebRTC服务器,该服务器将SRTP流传递给浏览器。

2. Websocket

它基于TCP,但是延迟比HLS低。同样,您需要一个Websocket服务器。

3. HLS

最流行的VOD(预录制视频)高延迟流协议。


3
如何使用网络套接字播放实时音频和视频流?唯一的视频播放方法是使用Broadway.js,而使用h264 nal流则非常不便。
mark gamache

1
HLS代表HTTP Live Streaming,我想知道为什么HLS被广泛用于VOD而不是LOD?
shintaroid '17

1
您无法从WebSocket在Web浏览器中播放视频。至少不是开箱即用。
迈克尔四世

-1,用于Web套接字...但并非出于其他所有原因。您绝对可以通过通过websocket接收数据来播放视频。使用MediaSource Extensions,这很简单。您不应该这样做,因为您可以直接使用HTTP Progressive!
布拉德(Brad)

8

使用VLC,我可以将实时RTSP流(mpeg4)转码为OGG格式(Vorbis / Theora)的HTTP流。质量很差,但是视频可以在Chrome 9中使用。我也已经在WEBM(VP8)中使用转码进行了测试,但是它似乎不起作用(VLC可以选择,但是我不知道它现在是否真的实现了。) )

第一个拥有此文档的人应通知我们;)


2
"C:\Program Files\VideoLAN\VLC\vlc.exe" -I dummy screen:// :screen-fps=16.000000 :screen-caching=100 :sout=#transcode{vcodec=theo,vb=800,scale=1,width=600,height=480,acodec=mp3}:http{mux=ogg,dst=127.0.0.1:8080/desktop.ogg} :no-sout-rtp-sap :no-sout-standard-sap :ttl=1 :sout-keep-这是VLC命令哪些流的输入(例如屏幕捕获装置),以给定的输出流(例如127.0.0.1:8080/desktop.ogg
泽索特

1
然后您可以将其嵌入到视频代码中:<video id="video" src="http://localhost:8080/desktop.ogg" autoplay="autoplay">
Zsolt

2
但是不幸的是,性能还是很差的,如果也可以使用MP4容器来完成的话,那就更好了。AFAIK浏览器对MP4的支持比对OGG的支持更多。
Zsolt

1
它也对我有用。我已经将VLC设置为通过my_ip:port地址上的HTTP协议流式传输音频和视频,然后使用HTML5 <video>标签,如下所示:<video width="640"><source src="http://my_ip:port/test" type="video/ogg">HTML5 not supported</video>
patryk.beza

1

我对HTML 5视频标签和rtsp(rtp)流的观察是,它仅与konqueror一起使用(KDE 4.4.1,将Phonon后端设置为GStreamer)。我只有H.264 / AAC RTSP(RTP)流的视频(无音频)。

来自http://media.esof2010.org/的流不适用于konqueror(KDE 4.4.1,Phonon后端设置为GStreamer)。


1

Chrome未实现支持RTSP流的功能。一个重要的项目,以检查它WebRTC。

“ WebRTC是一个免费的开放项目,它通过简单的API为浏览器和移动应用程序提供实时通信(RTC)功能。”

支持的浏览器:

Chrome,Firefox和Opera。

支持的移动平台:

Android和IOS

http://www.webrtc.org/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.