如何从Linux服务器流式传输实时视频?


30

这是我想做的。环顾四周,但没有找到直接答案。我有一个Linux盒子,使用Ubuntu / MySQL / Apache运行网站。我也有自己的静态IP,即不使用虚拟主机。我希望能够将便携式计算机(大概运行Windows)上的网络摄像头的视频源流式传输到我的Linux服务器,并使我网站之一的用户能够在流式传输时看到该视频。显然,笔记本电脑将需要通过某种方式与服务器进行身份验证,但对于谁可以在网站上观看实时视频没有任何限制。谢谢。


您会问如何实施这样的解决方案,还是寻找现成的第三方解决方案?在以前的情况下,对于这个问题来说是错误的地方,我相信这是投票的原因

Answers:


46

我目前使用通过FireWire连接的3台miniDV摄像机开发在线流,这与您的需求非常相似。

快速提示:vlc + flowplayer / jw播放器

首先,可以在在线流中使用两种视频格式:FLV和h264。FLV易于转码,h264具有更好的大小/质量比,但转码消耗的CPU多得多。两者都可以由Flash Player在网页中显示。

第二,流媒体基础架构。由于笔记本电脑的带宽有限(最高为Mbps),因此需要将数据流传输到服务器,然后再将其传输到客户端。因此,流将流到服务器1次,然后从那里流到客户端N次。您尚未描述笔记本电脑的互联网连接,因此该场景分为两部分:

  1. 笔记本电脑已连接了公共IP地址,或者可以将NAT端口连接到笔记本电脑。这种情况要容易得多,因为您可以轻松便捷地将服务器连接到笔记本电脑。最大的缺点是,您绑定到一个位置(一个IP地址)。

  2. 笔记本电脑未与公共I地址连接。这有点棘手,但是可以在允许您SSH到服务器并具有足够上传速度(应达到1 Mbps)的任何网络上运行。

无论使用哪种方案,基础设施都将如下所示

CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
                                                                         - Client 1
                                                                         - Client 2
                                                                         - Client N

从笔记本电脑流式传输

  1. 从网络摄像头捕获视频。我从未从本地连接的网络摄像头捕获流,但是有许多示例如何通过V4L进行流传输,例如: Webcam Setup。您唯一感兴趣的部分是:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"

    这是连接到网络摄像头的VLC命令的第一部分。有关更多详细信息,请参见所提到的HOWTO。特别要看一下“视频组”部分,并正确设置到/ dev / video和/ dev / audio的设备路径。这些在笔记本电脑上可能会有所不同。

  2. 将视频转码为FLV。我个人使用FLV,因为它对CPU的需求较少。我使用的转码字符串是这样的:

    --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'

    它将使用MPGA音频将​​视频流转码为FLV格式(我的Ubuntu中不提供MP3)。采样率在某种程度上是强制性的,没有它就无法工作。但是您可以选择较小的值,例如22050。这将“按原样”对视频流进行转码,因此比例为1:1。您可以附加宽度和高度参数,甚至比例参数。查看VLC文档。

  3. 从笔记本电脑流式传输。现在,您必须创建本地流,服务器将在其上连接:

    :std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}

    这会将VLC流绑定到0.0.0.0:8081/stream.flv。整个命令将如下所示:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2" --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}'

在服务器上重播

  1. 在服务器上捕获流并将其重新流化。同样,我们使用VLC捕获和流式传输。用法基于本文开头的基础结构方案。正如我所展示的,笔记本电脑上的VLC在某些端口上传输视频。该端口必须可以从服务器访问。如果您拥有笔记本电脑的公共IP地址或NATed端口,则可以使用telnet进行测试:

    server$ telnet public_ip_address 8081

    除了“连接超时”之外的所有内容都会显示出您可以连接到笔记本电脑的流。如果没有公用IP地址,或者没有NAT端口,则必须采用其他方法。您可以从便携式计算机到服务器进行SSH SSH,然后将便携式计算机端口远程转发到服务器。正确的SSH命令为:

    laptop$ ssh your_user@server_ip_address -R 8081:127.0.0.1:8081

    该魔术命令会将您的笔记本电脑端口8081绑定到服务器端口8081。这意味着当您在服务器上连接到8081时,您将通过SSH隧道静默连接到笔记本电脑端口8081。酷吧?:)所以我们要做的就是简单的VLC连接和流式传输:

    server$ vlc http://localhost:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    或使用公共IP地址或NATed端口的情况下:

    server$ vlc http://public_ip_address:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    与笔记本电脑部分一样,服务器上的VLC绑定到端口8082。为什么是8082,而不是8081?SSH远程转发已采用8081。为什么我们不像第一个示例那样使用转码部分?视频已经是正确的格式,因此我们要做的就是按原样流式传输。

  2. 测试。在两个示例中,您都可以通过VLC查看流来测试功能。您可以测试本地流:

    laptop$ vlc http://localhost:8081/stream.flv

    您可以测试服务器的流:

    laptop$ vlc http://server_ip_address:8082/stream.flv

    在这两种情况下,您都应该看到网络摄像头输入。

在网络上显示流

通过Flash Player在网络上显示流(在大多数情况下可以使用)。我尝试了两种产品,它们可免费用于非商业用途:JW PlayerFlowplayer。我留在Flowplayer上,但我不记得这个原因,可能是因为插件(我不使用:))还是因为文档更好。

此处介绍了如何在网页中显示来自VLC的FLV流:使用asf和Flash将VLC流传输到网站

故障排除

请注意会出现许多问题。首先,像所有内容一样,阅读。VLC是一个非常健谈的程序,因此它将告诉您问题出在哪里。访问视频/音频设备的权限,缺少编解码器,拼写错误的--sout参数等可能会出现问题,...学会使用iftop以查看数据是否确实流经网络等。


1
非常感谢!这比我预期的要多。将签出VLC,并将您的信息用作指导。

3

我在这里选择的工具是VLC。它不仅是一种多功能的多格式视频播放器,而且还能够以多种文件格式和流协议进行流传输。另外,它可以在Windows和Linux主机之间跨平台工作。

几年前,我们已经进行了类似的设置,其中使用窄带DSL线路(上游128 K)的客户需要将其网络连接的网络摄像头流式传输给广大受众。作为“反射器”主机的VLC安装完成了凸轮信号的旋转,从流客户端获取了主要的带宽负载,并以不同的流协议和格式呈现了流。


1

并不是我真正的专业领域,但是也许我可以为您指出一个潜在的方向。

商业实现是使用Adobe的Flash Media Server。当然,这可能是一个相当昂贵的方法。但是,有开源替代方案-例如Red5。您将需要安装服务器(它具有Java依赖性)。

一旦服务器运行,您就可以选择您的前端(我相信Red5附带了一些示例,但您也可以将JW Player与一起使用type=camera)。

前端将接收来自媒体服务器的流视频,然后您将流上传到媒体服务器。

更多信息:Red5帮助和信息以及Red5参考


jwplayer是一件很棒的个人用途
Kendrick
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.