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

这就是我想要做的.环顾四周,但没有找到任何直接的答案.我有一个使用Ubuntu / MySQL / Apache运行网站的Linux机器.我也拥有自己的静态IP,即不使用虚拟主机.我希望能够将视频源从笔记本电脑上的网络摄像头(可能是运行Windows)流式传输到我的Linux服务器,让我的某个网站的用户能够在流式传输时看到该视频.显然,笔记本电脑需要以某种方式对服务器进行身份验证,但是对于谁可以在网站上查看实时视频应该没有限制.谢谢.
最佳答案
我目前正在通过FireWire连接的3台miniDV摄像机开发在线流媒体,这与您的需求非常相似.

快速提示:vlc flowplayer / jw player

首先,有两种视频格式,您可以在在线流媒体中使用:FLV和h264. FLV更易于转码,h264具有更好的尺寸/质量比,但转码消耗更多.两者都可以由网页中的flash播放器显示.

其次,流媒体基础设施.由于您的笔记本电脑的带宽有限(几Mbps顶部),您需要获得流到您的服务器,并将其重新发送给客户端.因此,流将流向服务器1次,然后从那里流向N次.您尚未描述笔记本电脑的互联网连接,因此该方案分为两部分:

>笔记本电脑连接公共IP地址或您可以NAT端口到笔记本电脑.这种情况要容易得多,因为您可以轻松地从服务器连接到笔记本电脑.最大的缺点是,您被绑定到一个位置(一个IP地址).
>笔记本电脑与公共地址无关.这有点棘手,但可以从任何网络工作,这将允许您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). Samplerate在某种程度上是强制性的,没有它就无法工作.但你可以选择较小的,如22050.这将按原样转码视频流,因此比例为1:1.您可以追加宽度和高度参数,甚至是缩放参数.查看VLC文档.
>从笔记本电脑流式传输.现在你必须建立本地流,服务器将在其上连接:

:STD {存取= HTTP {MIME =视频/ 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,采样率= 44100}:{STD访问= HTTP {MIME =视频/ 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命令是:

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

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

在网络上显示流

在大多数情况下,在Web上显示流是通过Flash播放器.我尝试了两种免费用于非商业用途的产品:JW PlayerFlowplayer.我一直在使用Flowplayer,但我不记得原因,可能是因为插件(我不使用:))或因为更好文档.

如何在网页中显示来自VLC的FLV流,请参见:Stream VLC to Website with asf and Flash

故障排除

注意会出现的许多问题.首先,就像在一切事物中一样,阅读. VLC是非常繁琐的程序,所以它会告诉你问题出在哪里.可能是访问视频/音频设备的权限,丢失编解码器,拼写错误的–sout参数等问题,…学习使用iftop查看数据是否真正通过网络等流动

转载注明原文:视频流 – 如何从Linux服务器流式传输实时视频? - 代码日志