如何从Raspberry Pi相机流式传输视频并实时观看


93

我是Raspberry Pi的新手,甚至是Raspberry Pi相机的新手。我已经在网上看到了很多有关Raspberry Pi相机的教程,但是还没有找到使我像使用网络摄像头(使用SimpleCV或OpenCV)那样直接从Raspberry Pi相机流式传输的内容。希望有人能指出我正确的方向。


您尝试过mjpgstreamer吗?Shell我发布解决方案了吗?
jaromrax

3
谁arelooking零延迟解决方案的人应该检查raspberrypi.stackexchange.com/a/32521/30681
igaurav

如果您有ssh和mpv :(ssh raspberrypi raspivid -o - -t 0 -fps 25 -w 640 -h 360 | mpv - --speed 2 --fps 25“-speed 2”可防止它滞后太多)。
变态的

Answers:


81

Diego提出的解决方案很好,除了它的速度很慢而且视频延迟很大,因为那里的vlc重新流了raspvid的流。从2013年12月12日开始,有一个官方的v4l2驱动程序可用:http : //www.ics.com/blog/raspberry-pi-camera-module#.VJFhbyvF-b8 这使上述重播过时。只需加载模块并使用它:

sudo modprobe bcm2835-v4l2
cvlc v4l2:///dev/video0 --v4l2-width 1920 --v4l2-height 1080 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:12345}'

这会在端口12345上创建一个http流,您也可以使用其他格式,例如Diego答案中的rtcp。在此处阅读更多信息:https : //web.archive.org/web/20151012014829/http : //www.videolan.org : 80/doc/streaming-howto/en/ch03.html


2
在此答案中,建议将其添加:demux=264到cvlc,因为流是RAW h264,并且您需要设置解复用器:cvlc v4l2:///dev/video0 --v4l2-width 1920 --v4l2-height 1080 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:12345}' :demux=264。例如,这使得可以在VLC for Android中观看流。
Jaime M.

8
在提供的链接中,autoreconf -vfi现在而不是您应该使用./bootstrap.sh
JuJoDi 2015年

1
有没有一种方法可以让我既传输视频又将其保存到RPi SD卡上?
或Weinberger


4
我认为可能值得一提/确认此方法在无头环境中不起作用。我遇到错误,其中一个谈论X11
Nick

41

您可以在多个选项之间进行选择。在我的工作中,我们使用VLC将Raspberry Pi Camera捕获的视频从服务器机房流传输到办公室。这样做的一个缺点是大约有5秒钟的延迟,我还没有找到解决方案。以下是我们的设置:

  1. 安装并更新了raspbian并确保您的相机已启用(通过运行sudo raspi-config并选择“启用相机”来启用它)

    sudo apt-get update
    sudo apt-get upgrade
    
  2. 安装vlc

    sudo apt-get install vlc
    
  3. 创建脚本以使用以下内容启动流,或运行命令(如果仅运行命令,则无法执行其他任何操作)。

    sudo nano myscript.sh
    raspivid -o - -t 0 -hf -w 640 -h 360 -fps 25 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554}' :demux=h264
    
  4. 使脚本可运行

    sudo chmod +x myscript.sh
    
  5. 如果要自动启动流,则必须将脚本添加到crontab。为了使这项工作有效,我必须制作另一个由cron运行的脚本(OBS!VLC不能以sudo运行,因此请确保您位于正确的cron中)。sudo nano myscript2.sh

    #!/bin/bash
    /path/to/myscript.sh
    

    然后:

    sudo chmod +x myscript2.sh
    crontab -e
    @reboot /path/to/myscript2.sh
    
  6. 要观看视频流,请在与用于流式传输的树莓派相同的网络上的计算机上打开VLC。按媒体->打开Networkstream,然后将以下内容粘贴到字段中:

    rtsp://[IP].[TO].[THE].[PI]:8554/
    

如果您不关心FPS(每秒帧数)并且不希望有任何延迟,则可以使用MJPEG。您可以在此处了解更多信息

关注有关树莓派摄像头模块维基。希望您找到想要的东西。


知道为什么我会在Windows的VLC上获得以下内容吗?您的输入无法打开:VLC无法打开MRL'rtsp://192.168.1.78:8554'。检查日志以获取详细信息。Pi方面似乎还可以-没有错误,并且似乎对连接的客户端有反应?
monojohnny

@monojohnny是树莓派流吗?通过插入屏幕来检查视频是否真正正常工作。如果视频正常运行,您应该在屏幕上看到流已插入树莓派。
迭戈

@monojohnny感谢您的迭戈写作...在第一次尝试时就可以完美地工作!monojohnny ...您必须在结尾加上“ /”,否则vlc会抱怨。试试这个:rtsp://192.168.1.78:8554 /
Sujay Phadke'Nov

感谢@Diego,这对我来说非常有效,但是如何退出我的信息流?
Denoteone

我在Windows上遇到了同样的问题,我无法从pi流式传输视频。给定我在连接到pi的屏幕上看到来自pi摄像机的视频流,但是没有通过Windows 10 pc上安装的VLC看到。
Mostafa

23

我尝试了一些选择。但是,我使用该项目找到了最佳结果: eLinux社区的RPi-Cam-Web-Interface

流的延迟几乎为零。

祝好运 :)


4
人们在寻找零延迟,请务必进行检查。对@ user2998302的支持。我不敢相信,一年来没有对此的赞誉(致谢)。
igaurav '16

尽管这是一种快速简便的设置,但该软件远未进行优化,因此,尽管其低延迟(没有零延迟),但界面非常闲谈,并使用了一些额外的CPU周期。如果您不运行其他任何设备,这不是问题,但是如果您正在运行其他设备,则可能是问题,尤其是在Pi 1
Nick

这太棒了!
Hamza Ouaghad

我测试过的迄今为止最快的网络视频流传输(也是通过vlc传输的本机v4l2驱动程序),延迟几乎为零。互联网上有关此问题的所有资源都无法比该应用程序更好地抱怨优化。
加伯尔

哇,我必须承认这一点!
L.Trabacchin

18

我发现的最简单的方法是,使用树莓派相机从无头的树莓派获取实时视频。

该解决方案可以直接使用,而无需在PI上安装其他软件。

在PI上:

raspivid -t 0 -l -o tcp://0.0.0.0:3333

在计算机上,可以使用VLC流式传输:

vlc tcp/h264://192.168.66.154:3333

(假设192.168.66.154是PI的IP地址)


欢迎来到Raspberry Pi!通常,我们不鼓励将您的答案从一个问题逐字复制到另一个问题—一旦达到15个代表,您就可以将与“重复”相同的问题标记为“重复”,因此答案只能复制一个。不过,感谢您分享您对问题的回答!
Aurora0001

@Per Hansen不为我工作...除了分配端口外,可能还需要做其他事情。
阿米特·雷

这很棒!无头使用RPi3B +和Raspbian 9.4(拉伸)。
dparkar

5

我在树莓论坛上发布了一个可能的解决方案,使用基于live555轻型RTSP服务器,该服务器带有支持H264捕获的V4L2驱动程序:

sudo modprobe -v bcm2835-v4l2
git clone https://github.com/mpromonet/v4l2rtspserver.git
cd v4l2rtspserver
cmake .
make install
v4l2rtspserver -H <height> -W <width> -F <fps>

接下来,您应该可以使用以下命令访问RTSP流:

vlc rtsp://<raspberry>:8554/unicast

时间差呢?
kuhajeyan

比cvlc短。
mpromonet '16

cmake抱怨“找不到ALSA(缺少:ALSA_LIBRARY ALSA_INCLUDE_DIR)”,直到我为项目添加了更多软件包为止。解决方案就在其中:“ sudo apt-get install libopus-dev libexpat1-dev libasound2-dev libudev-dev libavahi-client-dev”(我想在这里asound可能就足够了)。
MoonCactus

哦,而且效果很好(轻量级解决方案),谢谢。时滞是不错的,大约2秒钟,与其他解决方案相比效果更好。
MoonCactus

@MoonCactus:我想我已经修复了ALSA安装(它只需要libasound2-dev)。滞后应该小于一秒,如果您使用vlc,则可以使用--network-caching 300
mpromonet

4

UV4L(也)支持标准HTML5视频和音频流,无需进行配置。其他选项也是可能的,例如通过http的MJPEG。

更新:

UV4L现在还支持通过Web向Jitsi Meet Rooms进行实时音频和视频广播。无需特殊配置。只需输入您的姓名,房间并单击“ 开始”即可

第二次更新:

UV4L现在也支持H264硬件编码的视频,包括全fps,高清和将来可能的全高清。


1
唯一的事情是,您只能获得基本流,几乎所有内容都不了解。遗憾的是,没有多大用处。你需要的东西发出的WebRTC(其中,如果你已经有了一个PI2以后,你可以用UV4L如果你需要(因为零功率/尺寸限制)要做到这一点,您的SOL。
Svartalf

3

双方mjpeg_streamermotion似乎比CVLC更好的延迟。

使用 mjpg_streamer

mjpeg_streamer 需要编译,但是github上的说明很简单。

编译后,可以通过start.sh从项目目录启动或直接运行(在项目目录中)运行它:

./mjpg_streamer -i "./input_uvc.so -rot 180" -o "./output_http.so -w ./www -p 8090"

8090TCP端口在哪里。如果未指定,则8080默认使用端口。该start.sh脚本包含一些带有附加选项的用法示例。

使用 motion

Motion包含一项systemd服务,可在启动,停止或重新启动时轻松进行自动启动。

要在IP网络摄像头模式下使用它,应在以下位置设置以下设置/etc/motion/motion.conf

daemon on
stream_localhost off
output_pictures off
ffmpeg_output_movies off
stream_maxrate 24
framerate 24
width 640
height 480

接下来,/etc/default/motion设置:

start_motion_daemon=yes

要使服务在启动时自动启动:

systemctl enable motion

使用systemctl start/stop/restart motion了相应的动作。

默认流端口为8081。端口设置在stream_port/etc/motion/motion.conf


1

我不知道您是否正在寻找监视软件,但是我已经成功安装并运行motion了软件运动检测器。您应该看一下官方指南


运动仅适用于USB摄像头
2015年

3
@geneorama motion使用不限于USB摄像头的video4linux接口,bcm2835-v4l2模块可通过此接口访问摄像头板。
mpromonet 2015年

1

我已经能够在Raspberry Pi 2上使用uv4l WebRTC 流式传输视频。这非常容易。只需按照教程进行即可。希望对您有所帮助。


请在此处包括本教程的相关部分,以防止链接腐烂。
Bex

仅适用于Pi2及更高版本。不适用于1A / 1A + /零。由于人们似乎能够做到,所以不完全确定他为什么不能这样做,但是嘿……
Svartalf 16-10-29

1

我在Windows 7上获取视频流时遇到了麻烦。有很多Linux解决方案,直到现在我都无法在Windows上复制它们。最终我得到了一个非常快速的解决方案:

  1. 获得Windows版本的Netcat:http : //joncraton.org/files/nc111nt.zip,解压缩并添加到路径
  2. 得到一个新版本的mpc-hc,可以从stdin中读取:https : //mpc-hc.org/downloads/ install并将其路径也添加到path(我的是64位,但希望32位可以以及

在树莓派上:

raspivid -t 0 -w 1024 -h 768 -fps 20 -b 1000000 -o - | nc your.receiver.ip.address 5001

在Windows机器上:

nc -l -p 5001 | mpc-hc64 -

因此,我认为,没有任何东西可以重新打包或重新打包,重新混合或如此。来自raspvid的二进制流被馈送到mpc并显示。我的覆盆子通过wifi进行操作,因此起初我得到了一个合理的延迟,将延迟缩短了大约半分钟,降至0.2-0.3秒。

不幸的是,我无法以相同的方式使用vlc,因为nc -l -p 5001 | vlc -打开vlc窗口时没有任何视频。


1

我将Nginx与RTMP支持一起用于流媒体传输到世界,并与avconv一起用于处理摄像机输入。可以在Github上找到代码。


好人,您愿意分享任何视频时滞的经验吗?
kuhajeyan

2
是的,大约有5秒的延迟。
TTT

0

尽管彼得·汉森(Peter Hansen)的代码很可能在LAN上可以正常工作,但出于完整性考虑:TCP的数据完整性与实时性有关。在实时流中,为了及时显示,某些数据丢失可能是可以接受的。在这种情况下,UDP可能更好。我尚未测试该代码。

如果它是安全摄像机,则可以考虑多播。现代路由器甚至可以做到100美元的模型。


0

我已经按照README.md上的说明从我的pi上的https://github.com/BreeeZe/rpos安装了ONVIF解决方案。

唯一的区别是我已经安装了node v8.4.0。这使我可以在连接到同一网络的NVR中查看摄像机的输出。此外,可以使用地址通过VLC播放器网络流直接播放摄像机rtsp://192.168.1.3:8554/h264


0

一会儿也遇到了类似的问题:

https://www.npmjs.com/package/ws-avc-player

它比其他提议的解决方案更准,但我认为如果优先考虑通过Web的低延迟,则效果很好。

适用于大多数浏览器(甚至是480p的移动设备),而无需在浏览器上安装任何插件。


我没有编写解码器本身,它是一个单独的项目github.com/mbebenita/Broadway。 然而,它的优化令人惊讶地得到了很好的优化,正如我在回答中所说,它可以轻松处理dp上的480p。我选择Brodway的原因是因为rpi上没有vp8 / 9硬件编码器,因此h264实际上是唯一不错的选择。但是,如果要在浏览器中使用本机h264解码器,则可以忘记低延迟。
MatijaG

听起来太不可思议了,我必须尝试一下。
kwasmich

任何反馈将非常欢迎:)
MatijaG

只是现在我有一些业余时间。我无法让示例与raspivid相机供稿一起运行。随着ffmpeg在另一方面我刚开始帧每秒的十分之一。我使用了干净的Raspbian和Pi Zero。你对我有什么提示吗?
kwasmich

是的,使用ffmpeg会因为缺乏硬件加速而一事无成。尝试使用以下示例运行该示例: node example/index.js raspivid如果遇到问题,请尝试立即node example/index.js单独运行/opt/vc/bin/raspivid -pf baseline -ih -t 0 -w 640 -h 480 -hf -fps 15 -g 30 -o - | nc localhost 5000,看看是否从raspivid中得到任何错误
MatijaG,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.