我想使用 gstreamer 将网络摄像头的视频流式传输到网络。在嵌入式 Linux 环境中,我使用以下命令运行 gstreamer:
gst-launch mfw_v4lsrc ! vpuenc codec=12 ! multipartmux ! tcpserversink host=127.0.0.1 port=1234 sync=false
我可以使用 VLC 播放器接收此流 tcp://127.0.0.1:1234
.这很完美。
现在我想在我的网络浏览器中显示视频。我发现我不能使用HTML5视频标签。这显示了一个黑色图像。同时使用 http://127.0.0.1:1234
将显示视频控件,但不显示视频。
因此,我尝试使用 PHP 来接收流并使用 Web 服务器来发送它们。我在php网站上实现了这个例子:
<?php
$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />'n";
} else {
fwrite($fp, "GET / HTTP/1.0'r'nHost: www.example.com'r'nAccept: */*'r'n'r'n");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}
?>
这仅打印流的接收字节。但是我不知道如何对流进行编码以显示视频。如何将流转换为网页上显示的视频?
最符合浏览器的方法是
网络RTC流媒体
目前,我仍在寻找一种好方法。
- 我对OpenWebRTC寄予厚望,但还没有设法构建它。
- Kurento媒体服务器中有一个webrtcsink GStreamer插件,但我还没有弄清楚它是否可以在自己身上使用。可以在 Ubuntu 13.10 或 14.04 上安装并试用;从源代码构建需要大量的设置和探索。
- 有一个Janus服务器。
- 可能,还有更多的选择。
或
您可以使用流服务器执行以下操作之一:
- 代理RTMP流(最初由Adobe提供,现在开源);
- 分发 HTTP 实时流 (hls);
- 分发 MPEG-DASH HTTP 流。
我个人使用nginx RTMP模块。还有其他选择,例如Wowza。
目录
GStreamer有flvmux ! rtmpsink
。
在页面上,您将需要一个Flash播放器。JWPlayer为我工作。
HLS
with nginx-rtmp-module
流式传输它,或者你可以玩这个小的http启动程序。
HLS可以在iOS和Android上原生工作,但不能在桌面上工作(不是没有Javascript客户端)。
破折号
用nginx-rtmp-module
流式传输它。
在某些浏览器中,HTML5支持DASH流 - 根据所使用的编解码器,情况非常糟糕 - 此外,您将需要一个破折号.js播放器。
HLS和DASH都需要在桌面浏览器(现在在Chrome,Safari和Opera中)中支持源媒体扩展,并使用Javascript播放器。
浏览器对某些关键技术和编解码器的支持:https://html5test.com/compare/feature/webrtc-webrtc/video-mediasource/video-h264/video-webmvp8.html