所以我今天得到了Raspberry Camera,并且静止图像工作正常。
捕获JPEG格式的图像:
raspistill -o image.jpg
捕获H.264格式的5秒钟视频:
raspivid -o video.h264
我不想安装任何其他应用程序,因为我想利用随时可用的HTML5。由于Chrome / Safari具有用于H.264的内置解码器,所以我只想将浏览器指向该URL并观看流。
我该如何实现?
所以我今天得到了Raspberry Camera,并且静止图像工作正常。
捕获JPEG格式的图像:
raspistill -o image.jpg
捕获H.264格式的5秒钟视频:
raspivid -o video.h264
我不想安装任何其他应用程序,因为我想利用随时可用的HTML5。由于Chrome / Safari具有用于H.264的内置解码器,所以我只想将浏览器指向该URL并观看流。
我该如何实现?
Answers:
苹果公司专有的实时视频流传输方法。它被称为HTTP Live Streaming(HLS),仅受Apple技术支持。Google(Chromium / YouTube)使用了自己的dash mpeg实施,其他所有人都感到困惑或使用了封装在MP4中的H.264。
优点
.m3u8
播放列表的设备缺点
m3u8
.m3u8
只是M3U格式的UTF-8版本。(.m3u文件可以具有多种编码。)有人声称,将.m3u8重命名为.m3u可以在所有HTML5浏览器上正常工作。我尝试了此方法,但对我没有用。流式传输的概念是记录至少5秒钟长的短文件段(在此示例中-可能有新方法可以加快速度),并保存到正确的文件中。播放列表文件将使用新文件名进行更新,并且客户端始终会轮询该播放列表并下载最新文件。有一些机制可以在客户端上无缝合并视频。这就是为什么其他开发商不希望实现这个,因为它需要一大把的精力和不符合标准的HTML5遵守(即使是实时流没有适当的HTML5标准?? EHH,叹息)。
正在安装
您需要编译ffmpeg
- 请勿apt-get install
用于FFmpeg
此过程最多可能需要5个小时- 必须是1.1版或更高版本,才能支持分段流。您可以使用它来克隆它并进行编译。
cd /usr/src
git clone git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg
./configure
make && make install
/usr/share/nginx/www/
制作一个名为Bash的Bash脚本文件video.sh
,将chmod +x
其应用并粘贴到其中。将基本文件夹更改为HTTP服务器所在的位置。我用nginx
,/usr/share/nginx/www/
#!/bin/bash
base="/data/live"
cd $base
raspivid -n -w 720 -h 405 -fps 25 -vf -t 86400000 -b 1800000 -ih -o - \
| ffmpeg -y \
-i - \
-c:v copy \
-map 0:0 \
-f ssegment \
-segment_time 4 \
-segment_format mpegts \
-segment_list "$base/stream.m3u8" \
-segment_list_size 720 \
-segment_list_flags live \
-segment_list_type m3u8 \
"segments/%08d.ts"
trap "rm stream.m3u8 segments/*.ts" EXIT
# vim:ts=2:sw=2:sts=2:et:ft=sh
创建一个将加载播放列表的HTML文件
<html>
<head>
<title>PiVid</title>
</head>
<body>
<video controls="controls" width="1280" height="720" autoplay="autoplay" >
<source src="stream.m3u8" type="application/x-mpegURL" />
</video>
</body>
</html>
支持
参考:http : //www.raspberrypi.org/phpBB3/viewtopic.php?p= 351392& sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392
原始代码:https : //github.com/AndyA/psips/blob/master/examples/hls.sh
-segment_wrap 10
为ffmpeg的参数,它将最多使用10个段文件。
segments/
指向段文件时,stream.m3u8也未包括在内,因此我删除了segments文件夹。我误会了吗?
感谢@mpromonet的评论,以对Linux-Projects V4L2驱动程序进行更新,该驱动程序现在非常高效地实现了MMAL-但它仍在进行中。
请按照以下说明安装linux-project存储库并安装带有其他功能的UV4L驱动程序。然后安装服务器和mjpeg。如果需要,您也可以尝试其他方法。
安装完所有内容后,您可以访问端口8080上的HTTP服务器。您还应该检查/etc/uv4l/conf
文件并设置是否要使用mjpeg或H.264,因为它们会有所不同,但是您可以通过内置Web调整一些设置。服务器。
这就是我们一直在等待的东西(称为WebRTC),并且感谢新的驱动程序(在Raspberry Pi 2上)运行良好。
首先,按照以下步骤操作:http : //www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14:
curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -
# Add the following line to the file /etc/apt/sources.list
# deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam
sudo apt-get install uv4l-raspicam-extras
然后在您的Raspberry Pi 2上安装此WebRTC(对于Raspberry Pi 1,请阅读链接的站点以获取其他选项)
sudo apt-get install uv4l-webrtc
重新启动所有驱动程序,然后转到
http://raspberry:8080/
现在,您可以直接将低延迟,高质量的视频流传输到现代浏览器(例如Chrome或Firefox)中。(也许是Safari,但我无法检查,因为他们不再使用Winblows和Internet Explorer了……)
默认情况下,它mjpeg
以1080p分辨率使用,并且非常缓慢。我将其调整为800x600帧大小,并使用iSpy之类的东西来处理视频。为了安全起见,在清晰的视频中我得到约10 fps。它比此驱动程序之前的640x480 3 fps更好。它可以在具有Safari,Android Chrome和几乎所有其他功能的iPhone上使用。
http://raspberrypi:8080/stream/video.mjpeg
这也意味着现在motion
(我仍然需要测试和比较)应该可以工作得更好。确保将配置设置为使用v4l2_palette 8
或v4l2_palette 2
现在,此问题已针对“流”进行了修复,我们无需花太多精力即可通过VLC媒体播放器观看H.264视频。流是原始H.264,因此,如果需要在其他地方工作,则需要对其进行解复用或转码/封装。bitrate=xxxxxx
如果通过Wi-Fi流式传输,则应在配置文件中进行调整。
在VLC媒体播放器中,您必须告诉它要使用H.264多路分配器。因此,如果您使用的是GUI,请确保添加参数:demux=264
。从命令行,vlc http.../video.h264 --demux h264
。否则,即使相机LED灯已打开,您也只会看到黑屏。
http://raspberrypi:8080/stream/video.h264
瞧!高清流大约有500毫秒的延迟(可进行微调,降至200毫秒)。绝对比使用旧方法容易得多。质量和FPS很棒,但是如果不转码到MP4或WebM,就不能将其嵌入HTML5中。我希望这将得以实现,因为它将真正使它成为一台出色的独立服务器。
不支持/实现
http://www.linux-projects.org/uv4l/tutorials/rtsp-server/
不支持/实现
没有video4linux
可用的驱动程序。这意味着我们无法使用ffserver通过/dev/video0
USB网络摄像头或类似网络流来传输数据。
这就是为什么很难找到适合HTML5浏览器的实时流式传输的原因。
Gstreamer
(不是HTML5)使用流式传输几乎实时(<0.5s)视频的文章<OBJECT ...
:) 将其嵌入到webpag中(延迟)video4linux
正式的V4L2驱动程序bcm2835-v4l2和用户空间V4L2驱动程序[ linux-projects.org/modules/sections/…– mpromonet
--demux h264
标志进行查看。我们仍然需要对此代码进行转码,以便在移动设备上使用或以mp4 / webm的形式嵌入网页。但是,这确实是朝着高效和高质量迈进的伟大一步。不要与“其他” UV4L非Linux项目驱动程序混淆。
/usr/bin/cvlc v4l2:///dev/video0 --v4l2-width 800 --v4l2-height 400 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:8080}' :demux=264
U4VL
带有内置HTTP(S)服务器的内核接口。
http://www.linux-projects.org/uv4l/tutorials/streaming-server/
Raspberry Pi Cam Web界面
silvanmelchior的一个不错的项目,它部署了像dvr这样的多目标流服务器的Web服务器。需要更多信息
https://github.com/silvanmelchior/RPi_Cam_Web_Interface
传统方法
几乎所有浏览器(包括Internet Explorer 6)都支持使用mjpg进行流传输。H.264之前使用的许多相机都使用了硬件mjpg,本质上是将jpeg文件尽可能快地转储到文件夹中,而mjpg将文件读入缓冲区并删除他们。某些设备可能会达到25 fps,即使您的连接不良,也至少会获得1 fps。
由于JPEG文件太大而无法在Internet上流式传输,并且H.264是一种更快,质量更好的协议,因此高清摄像机不再支持mjpg。
由于我们无法自然地使用摄像头模块广播H.264,因此这似乎是可行的后备...
它几乎是即时的,但不要期望其速度超过1.5 fps。这归结为raspistill
极度漫长!将延时功能设置为100毫秒(应为我们提供10 fps)不起作用,因为raspistill
它会阻塞并且本身存在严重的性能问题。
/tmp
以使用RAM来提高速度/etc/default/tmpfs
-更改RAMTMP=yes
(这是增加fps的一种尝试,但是raspistill不能保持其自身。)/usr/src
,mkdir mjpg-streamer,cd mjpg-streamer ...git clone https://github.com/engine12/mjpg-streamer.git
make USE_LIBV4L2=true clean all
sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
mjpg_streamer
和其插件input_*.so
和output_*.so
到/usr/local/bin
。否则,直接从src目录运行它。mkdir /tmp/stream
raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
LD_LIBRARY_PATH=./ ./mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w ./www"
(在二进制和插件所在的位置运行此命令)http://<IP-address>:8080
我挣扎着编译约5小时...... 叹息,但我想我会用这个,因为我可以从任何手机和任何浏览器访问流。我只需要等到我们获得更好的车手...再过一两年。:(
无论尝试哪种质量,使用流都不会比1 fps更快或更慢。我使用了720p和1080p,只有图像质量变好,但是fps在局域网上没有区别。我想较小的设置将有助于WAN / 3G或其他无线电传输。
raspistill将图像写入单个文件。这可能是一个瓶颈。它写入文件,mjpg strreamer读取并删除该文件,导致I / O阻塞,因此raspistill无法写入该文件。
我唯一能想到的就是使用raspivid传递到FFmpeg中,它将为我们创建JPEG文件-我需要尝试一下,这可能比usign raspistill快得多。我设法以令人震惊的质量获得了25 fps,并且延迟了大约10秒钟...调整设置使我获得了3 fps,但CPU的利用率为100%。没有硬件用于处理视频流...
raspivid -w 640 -h 480 -fps 25 -vf -t 86400000 -b 1800000 -o - \
ffmpeg -i - \
-f image2(?) \
-c:v mjpeg \
stream%d.jpg
我也在阅读,发现可以%d
在raspistill输出文件中使用文件名。我不知道这是否会提高fps。JPG编码在raspistill中也是硬件加速的,所以我真的很难弄清楚为什么它这么慢...
我%d
在文件名中使用了惊人的2 FPS 。由于某些原因,从raspistill写入JPEG文件的速度非常慢。叹。
从2017年(或更早)开始raspivid
,不再是首选方法,Pi开发人员建议人们改用V4L2。
因此,此方法允许您使用V4L2(而不是V4L2)通过RTP传输H264 raspivid
。我注意到此方法可减少辍学,并允许更高的比特率:
#!/bin/sh
# Use V4L2 (preferred) instead of raspivid
# exposure_dynamic_framerate=1 (raspivid --fps 0) - reduce framerate/increase exposure in low light
# scene_mode=8 (raspivid --exposure night) - allow framerate reduction to increase exposure
v4l2-ctl -v width=1296,height=972,pixelformat=H264 \
--set-ctrl=exposure_dynamic_framerate=1 \
--set-ctrl=video_bitrate=5000000 \
--set-ctrl=scene_mode=8
exec ffmpeg -f h264 -probesize 32 -r 30 -i /dev/video0 -vcodec copy -an -f rtp_mpegts udp://224.0.1.2:5004
此脚本将多播视频,并且可以使用以下命令在LAN上的另一台计算机上观看该视频:
ffplay -sync ext -an -fast -framedrop -probesize 32 -window_title "Raspberry Pi" -an udp://224.0.1.2:5004
-sync ext
导致视频以最快的速度播放,因此它将实时运行,而不是以固定的帧率运行,并且如果Pi捕获帧的速度比Pi快,则会滞后。这种方法仍然有些滞后,但并不比其他raspivid
方法差。
(提示:如果您插入支持IGMP的路由器或交换机,请确保224.0.0.0/4
您的计算机上没有防火墙,否则,当路由器询问您的PC是否想要任何多播流量时,PC将永远不会响应并且您将永远不会看到任何视频。)
正如我在下面的评论中提到的录制,在此我将对此进行扩展。您可以使用如下命令将网络流记录到磁盘:
ffmpeg -y -i udp://224.0.1.2:5004 -c copy \
-f segment -segment_atclocktime 1 -segment_time 900 \
-reset_timestamps 1
-strftime 1 /path/to/storage/pi-%wT%H%M.mkv
查看文件名中符号man strftime
的含义%
。本示例中的日期使用日期编号(0 =星期日,1 =星期一等),后跟a T
和时间。它每15分钟启动一个新文件。
需要明确的是,该录制命令旨在在远程PC上运行(而不是在Pi本身上),尽管它可能也可以在Pi上运行(未经测试)。
由于您每隔15分钟就会获得一个新文件,文件名中带有日期和时间,这意味着一周后您将开始生成已使用的文件名,从而导致最早的文件被覆盖。换句话说,您将得到前一周素材的滚动循环。对于您几乎不需要回去一周以上的安全摄像机而言,这是理想的选择。
附带说明,这会产生约500GB的文件,因此,如果您不希望文件占用太多空间,则可能需要调整比特率,分辨率或更快地覆盖文件(例如每24小时覆盖一次)。
ffserver
如果要多于一台机器来显示提要,则需要更改使用的命令或其他服务器系统。然后,在大约2-3个客户端(取决于视频比特率)之后,Pi的USB以太网适配器将耗尽带宽。使用多播,无需运行服务器(客户端计算机只需选择是侦听还是忽略流量),因此您可以使成千上万台计算机显示视频而不会影响Pi,而Pi只会发送单个视频流。
我设法使用内置模块nginx-rtmp从Raspberry Pi流到Web服务器。
为了避免麻烦ffmpeg
,我建议使用Arch Linux Arm之类的滚动发行版。
raspivid -vf -t 0 -fps 25 -b 2000000 -o - |
ffmpeg -i - -vcodec copy -an -r 25 -f flv rtmp://x220/myapp/mystream
一些注意事项:
因此,在此基础上,我认为从Raspberry Pi进行实时流传输对于临时广播而言可能是可以的,但对于永远在线的网络摄像头而言却不可行,因为它过于占用带宽。您将不会获得音频,如果有,它将执行同步任务。
您可以在录制视频的同时分别更有效地录制音频。然后,稍后再混合音频输入,然后将其转换为WebM,并将其作为带有HTML视频标签的静态文件放在您的httpd上。工作流程非常尴尬,尽管这是我能想到的最好的方法,它可以在浏览器之间轻松进行有效的广播。
UV4L现在通过WebRTC和HTML5支持实时音频和视频流。
皮奥特·库拉(Piotr Kula)的答案似乎正确无误,但在覆盆子拉伸方面已经过时。
有关树莓派上uv4l的更新说明,网址为
https://www.linux-projects.org/uv4l/installation/
# switch to superuser mode
sudo -s
# add the repository key for uv4l
curl http://www.linux-projects.org/listing/uv4l_repo/lpkey.asc | sudo apt-key add
# add the url for the u4vl repository to apt
echo "deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/stretch stretch main" >> /etc/apt/sources.list
apt-get update
apt-get install uv4l uv4l-raspicam
apt-get install uv4l-raspicam-extras
# do not forget to install the server - see what happens if you do
# below
apt-get install uv4l-server
reboot
您可以通过/etc/uv4l/uv4l-raspicam.conf来对uv4l选项进行操作,然后使用以下命令重新启动服务
sudo service uv4l_raspicam restart
在我的情况下,事情开箱即用(如果忘记安装uv4l-server ...)。以下注释可以帮助您调试类似的问题。
我检查服务器是否正在运行:
pgrep -fla uv4l
995 /usr/bin/uv4l -f -k --sched-fifo --mem-lock --config-file=/etc/uv4l/uv4l-raspicam.conf --driver raspicam --driver-config-file=/etc/uv4l/uv4l-raspicam.conf --server-option=--editable-config-file=/etc/uv4l/uv4l-raspicam.conf
以及是否与
sudo netstat -tulpn
但是列表中没有uv4l条目。我原本以为8080端口
uv4l --sched-rr --mem-lock --driver raspicam \
> --width 960 --height 540 --framerate 30 \
> --encoding mjpeg --vflip --hflip
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct 6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 960x544, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l
但是服务器仍然没有自动启动...
man uv4l
然后给我看一下选项
--enable-server [=arg(=required)] (=auto)
enable the streaming server. Possible values are: 'auto' (tenta‐
tively start the server), 'required' (exit if failing to start
the server, only works if --foreground is enabled), 'off' (no
server at all).
所以我尝试了:
pkill uv4l
sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct 6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l
但仍然没有服务器在端口8080或elswhere上运行。因此,似乎我忘记了手册页指出的“ --foreground”选项是必需的:
sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct 6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<warning> [core] libserver.so: cannot open shared object file: No such file or directory
<alert> [core] No Streaming Server detected
现在,这是一个清晰的提示!似乎还没有服务器-请安装它:
sudo apt-get install uv4l-server
然后再试一次:
sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct 6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<notice> [server] HTTP/HTTPS Streaming & WebRTC Signalling Server v1.1.125 built on Mar 9 2019
<warning> [server] SSL is not enabled for the Streaming Server. Using unsecure HTTP.
<notice> [core] Streaming Server loaded!
<notice> [core] Registering device node /dev/uv4l
<notice> [server] Web Streaming Server listening on port 8080
现在可以在http:// pi:8080上使用服务器(用服务器的ip或主机名替换pi)
重新启动后,它无需输入其他命令即可工作。
webkitRTCPeerConnection is not defined
错误。我通常将IceWeasel用于WebRTC,但Jitsi不支持。