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

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

这就是我想要做的。四处寻找但没有找到任何直接的答案。我有一个使用 Ubuntu/MySQL/Apache 运行网站的 Linux 机器。我也有自己的静态 IP,即不使用网络托管。我希望能够将笔记本电脑(可能运行 Windows)上的网络摄像头的视频流传输到我的 Linux 服务器,并让我的一个网站的用户能够在流式传输时实时观看该视频。显然,笔记本电脑需要以某种方式与服务器进行身份验证,但对于谁可以在网站上观看实时视频应该没有任何限制。谢谢。

答案1

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

快速提示:vlc + flowplayer/jw player

首先,有两种视频格式可用于在线流媒体:FLV 和 h264。FLV 更容易转码,h264 具有更好的大小/质量比,但转码更耗费 CPU。这两种格式都可以在网页上通过 Flash 播放器显示。

其次,流媒体基础设施。由于笔记本电脑的带宽有限(最多几 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 进行捕获的示例,例如: 网络摄像头设置。您唯一应该感兴趣的部分是:

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

    这是 VLC 命令连接网络摄像头的第一部分。有关更多详细信息,请遵循上述操作指南。特别查看“视频组”部分并将设备路径更正为 /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 命令是:

    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 地址或 NAT 端口的情况下:

    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?8081 已被 SSH 远程转发占用。为什么我们不像第一个示例中那样使用转码部分?视频已经是正确的格式,所以我们所要做的就是按原样流式传输。

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

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

    您可以测试服务器的流:

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

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

在网络上显示流

大多数情况下,在网络上显示流是通过 Flash Player 实现的。我尝试了两种产品,它们对于非商业用途是免费的:JW播放器流动播放器。我继续使用 Flowplayer,但我不记得原因了,也许是因为插件(我不使用:))或者因为更好的文档。

这里介绍了如何在网页上显示来自 VLC 的 FLV 流:使用 asf 和 Flash 将 VLC 流式传输到网站

故障排除

意识到许多问题将会发生。首先,就像所有事情一样,。VLC 是一款非常健谈的程序,因此它会告诉您问题出在哪里。可能是访问视频/音频设备的权限问题、缺少编解码器、拼写错误的 --sout 参数……学会使用它iftop来查看数据是否真的通过网络流动等。

答案2

我在这里选择的工具是甚高频。它不仅是一款多功能、多格式的视频播放器,还能够以多种文件格式和流媒体协议进行流媒体播放。作为一项额外功能,它可在 Windows 和 Linux 主机之间跨平台运行。

几年前,我们设置了类似的系统,当时一位使用窄带宽 DSL 线路(128 K 上行)的客户需要将他连接网络的网络摄像头的视频流传输给广大观众。VLC 安装作为“反射器”主机,执行摄像头信号轮换,承担流媒体客户端的主要带宽负载,并以不同的流媒体协议和格式呈现流媒体。

答案3

这实际上不是我的专业领域,但也许我可以为您指明一个潜在的方向。

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

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

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

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

相关内容