2016-07-09 114 views
1

我尝试使用相机模块将Raspberry Pi 3中的H264 RTP流制作为视频标签。H264与gstreamer-1.0的RTP流

使用下面的代码来启动流

raspivid -t 0 -h 720 -w 1080 -fps 25 -hf -b 2000000 -o - | \ 

gst-launch-1.0 -v fdsrc \ 
      ! h264parse \ 
      ! rtph264pay \ 
      ! gdppay \ 
      ! udpsink host="192.168.0.11" port=5000 

然后我提供了一个简单的网页与视频标签:

<video id="videoTag" src="h264.sdp" autoplay> 
     <p class="warning">Your browser does not support the video tag.</p> 
</video> 

在src引用以下SDP文件:

v=0 
m=video 5000 RTP/AVP 96 
c=IN IP4 192.168.0.51 
a=rtpmap:96 H264/90000 

当我加载网页没有任何反应,并且js控制台完全是空的。

于是,我就查看与VLC流,并得到了以下错误:

[00007efd80c03ea8] es demux error: cannot peek 
[00007efd80c03ea8] es demux error: cannot peek 
[00007efd80c03ea8] live555 demux error: no data received in 10s, aborting 

我认为没有当年UDP通信可言,所以我从远程计算机进行了测试:

gst-launch-1.0 udpsrc port=5000 \ 
       caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" \ 
       ! fakesink dump=true 

ans收到UDP数据包。所以,我研究着,发现这个:

https://cardinalpeak.com/blog/the-many-ways-to-stream-video-using-rtp-and-rtsp/

现在很显然,我需要2个端口一个数据流,并建立RTP控制协议。然而,我不知道如何用gstreamer做到这一点。

最糟糕的是,当我运行:

gst-inspect-1.0 | grep -i rtcp 

我什么也没得到。

如何用gstreamer-1.0将视频流启动到使用RTP协议的网页内的视频标签?

更新

使用videotestsrc作为gstreamer的videosoruce和除去gdppay(它引起无效RTP有效载荷的错误),我能够从远程客户端与VLC查看视频流和与此gstreamer的代码:

gst-launch-1.0 udpsrc port=5000 \ 
       caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" \ 
       ! rtph264depay \ 
       ! avdec_h264 \ 
       ! autovideosink 
+0

你为什么认为浏览器将播放RTP流? HTML5视频的支持格式范围有限,H.264 over RTP不是其中之一。 –

回答

0

首先,你需要提供更多的信息:该浏览器(Chrome的尝试,也Safari是说有更好的流支持)..

对于SDP我想你错过了它的h264的信息? 是的,gdppay仅适用于内部“仅限GStreamer”流(gdp表示“GStreamer数据协议”,其他人不了解:))。

如果您真的想让GStreamer传输RTSP,您可以使用gstreamer rtsp server implementation - 这是单独的回购,并且包含在Ubuntu的某些软件包中。

如果你只需要rtp,你正在做的正确 - 正如你看到这种方法适用于例如vlc ..但是什么让你认为sdp将在HTML5中工作(我只是问我没有及时更新在这方面的信息)?

你也可以用netcat测试它 - 它适用于这类调试。 你可以伪造一个RTP客户这样说:

nc -u -l 5000 

这将倾倒交通的。

我读here有与HTML5 RTP/RTSP的问题,但谁知道也许现在已经工作..

你可以尝试HLS - 这通常用于流媒体,并具有更好的支持INT GStreamer这几天1.6和更多版本..(提示:使用hlssink)。

这里有一些JS处理HLS: https://github.com/dailymotion/hls.js

您也可以尝试OGG/Vorbis格式/ Theora格式和这样的东西(听起来很疯狂,但你可以给它一个镜头,我读的地方,它适合流媒体)..