这就是我想要做的。四处寻找但没有找到任何直接的答案。我有一个使用 Ubuntu/MySQL/Apache 运行网站的 Linux 机器。我也有自己的静态 IP,即不使用网络托管。我希望能够将笔记本电脑(可能运行 Windows)上的网络摄像头的视频流传输到我的 Linux 服务器,并让我的一个网站的用户能够在流式传输时实时观看该视频。显然,笔记本电脑需要以某种方式与服务器进行身份验证,但对于谁可以在网站上观看实时视频应该没有任何限制。谢谢。
答案1
我目前通过 FireWire 连接的 3 个 miniDV 摄像机开发在线流媒体,这与您的需求非常相似。
快速提示:vlc + flowplayer/jw player
首先,有两种视频格式可用于在线流媒体:FLV 和 h264。FLV 更容易转码,h264 具有更好的大小/质量比,但转码更耗费 CPU。这两种格式都可以在网页上通过 Flash 播放器显示。
其次,流媒体基础设施。由于笔记本电脑的带宽有限(最多几 Mbps),您需要将流媒体传输到服务器,然后再将其重新传输到客户端。因此,流媒体将流向服务器 1 次,然后从那里流向客户端 N 次。您尚未描述笔记本电脑的互联网连接,因此场景分为两个部分:
笔记本电脑已连接到公共 IP 地址,或者您可以通过 NAT 端口连接到笔记本电脑。这种情况要简单得多,因为您可以轻松地从服务器连接到笔记本电脑。最大的缺点是,您只能绑定到一个位置(一个 IP 地址)。
笔记本电脑未连接公共 I 地址。这有点棘手,但可以在任何允许您通过 SSH 连接到您的服务器并具有足够上传速度(1 Mbps 应该可以)的网络上进行。
无论使用哪种场景,基础设施看起来都是这样的
CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
- Client 1
- Client 2
- Client N
通过笔记本电脑进行流媒体播放
从网络摄像头捕获视频。我从来没有从本地连接的网络摄像头捕获过流,但有很多通过 V4L 进行捕获的示例,例如: 网络摄像头设置。您唯一应该感兴趣的部分是:
laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"
这是 VLC 命令连接网络摄像头的第一部分。有关更多详细信息,请遵循上述操作指南。特别查看“视频组”部分并将设备路径更正为 /dev/video 和 /dev/audio。这些在您的笔记本电脑上可能有所不同。
将视频转码为 FLV。我个人使用 FLV,因为它对 CPU 的要求较低。我使用的转码字符串是这样的:
--sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'
这会将视频流转码为带有 MPGA 音频的 FLV 格式(我的 Ubuntu 中没有 MP3)。采样率在某种程度上是强制性的,没有它就无法工作。但您可以选择较小的值,例如 22050。这会“按原样”转码视频流,因此比例为 1:1。您可以附加宽度和高度参数,甚至比例参数。查看 VLC 文档。
从笔记本电脑播放。现在您必须创建本地流,服务器将连接到该流:
: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}'
在服务器上重新流式传输
在服务器上捕获流并重新流式传输。再次,我们使用 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 远程转发占用。为什么我们不像第一个示例中那样使用转码部分?视频已经是正确的格式,所以我们所要做的就是按原样流式传输。
测试。在这两个示例中,您可以通过 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 安装作为“反射器”主机,执行摄像头信号轮换,承担流媒体客户端的主要带宽负载,并以不同的流媒体协议和格式呈现流媒体。