这是我想做的。环顾四周,但没有找到直接答案。我有一个Linux盒子,使用Ubuntu / MySQL / Apache运行网站。我也有自己的静态IP,即不使用虚拟主机。我希望能够将便携式计算机(大概运行Windows)上的网络摄像头的视频源流式传输到我的Linux服务器,并使我网站之一的用户能够在流式传输时看到该视频。显然,笔记本电脑将需要通过某种方式与服务器进行身份验证,但对于谁可以在网站上观看实时视频没有任何限制。谢谢。
这是我想做的。环顾四周,但没有找到直接答案。我有一个Linux盒子,使用Ubuntu / MySQL / Apache运行网站。我也有自己的静态IP,即不使用虚拟主机。我希望能够将便携式计算机(大概运行Windows)上的网络摄像头的视频源流式传输到我的Linux服务器,并使我网站之一的用户能够在流式传输时看到该视频。显然,笔记本电脑将需要通过某种方式与服务器进行身份验证,但对于谁可以在网站上观看实时视频没有任何限制。谢谢。
Answers:
我目前使用通过FireWire连接的3台miniDV摄像机开发在线流,这与您的需求非常相似。
快速提示:vlc + flowplayer / jw播放器
首先,可以在在线流中使用两种视频格式:FLV和h264。FLV易于转码,h264具有更好的大小/质量比,但转码消耗的CPU多得多。两者都可以由Flash Player在网页中显示。
第二,流媒体基础架构。由于笔记本电脑的带宽有限(最高为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进行流传输,例如: 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格式(我的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,然后将便携式计算机端口远程转发到服务器。正确的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。为什么我们不像第一个示例那样使用转码部分?视频已经是正确的格式,因此我们要做的就是按原样流式传输。
测试。在两个示例中,您都可以通过VLC查看流来测试功能。您可以测试本地流:
laptop$ vlc http://localhost:8081/stream.flv
您可以测试服务器的流:
laptop$ vlc http://server_ip_address:8082/stream.flv
在这两种情况下,您都应该看到网络摄像头输入。
在网络上显示流
通过Flash Player在网络上显示流(在大多数情况下可以使用)。我尝试了两种产品,它们可免费用于非商业用途:JW Player和Flowplayer。我留在Flowplayer上,但我不记得这个原因,可能是因为插件(我不使用:))还是因为文档更好。
此处介绍了如何在网页中显示来自VLC的FLV流:使用asf和Flash将VLC流传输到网站
故障排除
请注意会出现许多问题。首先,像所有内容一样,阅读。VLC是一个非常健谈的程序,因此它将告诉您问题出在哪里。访问视频/音频设备的权限,缺少编解码器,拼写错误的--sout参数等可能会出现问题,...学会使用iftop
以查看数据是否确实流经网络等。