这是我想要做的。环顾四周,但没有找到任何直接的答案。我有一个使用 Ubuntu/MySQL/Apache 运行网站的 Linux 机器。我也有自己的静态 IP,即不使用网络托管。我希望能够将来自笔记本电脑(可能运行 Windows)上的网络摄像头的视频源流式传输到我的 Linux 服务器,并让我的一个网站的用户能够在流式传输时实时看到该视频。显然,笔记本电脑需要以某种方式向服务器进行身份验证,但对谁可以在网站上查看实时视频不应该有任何限制。谢谢。
小智 49
我目前正在开发通过 FireWire 连接的 3 个 miniDV 摄像机的在线流媒体,这与您的需求非常相似。
快速提示:vlc + flowplayer/jw 播放器
首先,您可以在在线流媒体中使用两种视频格式: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
Run Code Online (Sandbox Code Playgroud)
从笔记本电脑流式传输
从网络摄像头捕获视频。我从未从本地连接的网络摄像头捕获流,但有很多示例如何通过 V4L 来实现,例如: Webcam Setup。您应该感兴趣的唯一部分是:
laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"
这是连接到网络摄像头的 VLC 命令的第一部分。有关更多详细信息,请参阅上述 HOWTO。尤其是查看“视频组”部分和正确的 /dev/video 和 /dev/audio 设备路径。这些在您的笔记本电脑上可能会有所不同。
将视频转码为 FLV。我个人使用 FLV,因为它对 CPU 的要求较低。我使用的转码字符串是这样的:
--sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'
它将使用 MPGA 音频将视频流转码为 FLV 格式(MP3 在我的 Ubuntu 中不可用)。采样率在某种程度上是强制性的,没有它就无法工作。但是您可以选择较小的,例如 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 地址或 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?8081 已经被 SSH 远程转发占用了。为什么我们不像第一个例子那样使用转码部分?视频已经是正确的格式,所以我们所要做的就是按原样流式传输它。
测试。在这两个示例中,您可以通过 VLC 查看流来测试功能。您可以测试本地流:
laptop$ vlc http://localhost:8081/stream.flv
您可以测试服务器的流:
laptop$ vlc http://server_ip_address:8082/stream.flv
在这两种情况下,您都应该看到网络摄像头输入。
在网络上显示流
在大多数情况下都可以在 Web 上显示流是通过 Flash 播放器进行的。我尝试了两种非商业用途免费的产品:JW Player和Flowplayer。我留在 Flowplayer,但我不记得原因,可能是因为插件(我不使用:))或因为更好的文档。
此处介绍了如何在网页中显示来自 VLC 的 FLV 流:使用 asf 和 Flash 将 VLC 流式传输到网站
故障排除
意识到将出现的许多问题。第一件事,就像所有事情一样,阅读. VLC 是一个非常健谈的程序,所以它会告诉你问题出在哪里。可能是访问视频/音频设备的权限有问题,缺少编解码器,拼写错误的 --sout 参数,...学习使用iftop以查看数据是否真的通过网络流动等。