树莓派监控(3)— 树莓派监控推流和保存

一 树莓派监控推流

前面已经搭建好了流媒体服务器,并且利用OBS成功的进行了推流,VLC拉流成功看到了直播。但是对于树莓派来说没有OBS。所以只能使用其他的方式。

间接推流

第一篇文章中我们使用VLC成功的把树莓派监控的视频传送到指定端口,然后PC上也使用VLC进行播放。所以第一个想到的最简单的办法就是PC从树莓派获取视频,然后通过PC推送到服务器。

  1. 树莓派捕获视频
sudo raspivid -o - -t 0 -w 640 -h 360 -fps 25 | cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264

这是第一片文章的方法,树莓派使用raspivid捕获视频,然后利用cvlc发送到指定的端口。

  1. PC端推流

    前面是通过VLC进行播放,我们知道VLC本身也可以推流,所以先尝试使用VLC推送RTMP到服务器。

但是串流类型中并没有RTMP,只有RTP,并且封装方式只能选择raw格式,尝试推流不成功,所以看起来VLC默认是不支持使用RTMP的。我们前面使用OBS成功推流,所以换用OBS。

OBS可的来源可以选择VLC视频源,这里我们地址就是树莓派推送流的地址,端口8090。可以成功读取视频,剩下的事情就是点击开始推流了。通过VLC播放器从服务器拉流播放。


直接推流

使用PC来间接推流有点傻,完全可以买个摄像头配合OBS就可以完成监控直播了。:laughing: 树莓派的有点还是在于功耗,所以直接使用树莓派推流。 PC上VLC看起来不能推送RTMP,而树莓派我们使用命令行工具,在这之前只是使用简单的命令,所以详细了解一下VLC。


二 VLC

它的WIKI上有不少介绍,我们主要看看和推流相关的文档:https://wiki.videolan.org/Documentation:Streaming_HowTo/

VLC (initially VideoLAN Client), which can be used as a server to stream MPEG-1, MPEG-2 and MPEG-4 files, DVDs and live videos on the network in unicast or multicast ; or used as a client to receive, decode and display MPEG streams under multiple operating systems

VLC可以作为播放器播放视频,同时也可以作为流媒体服务器。这里有一个很重要的概念就是codeccontainer,也就是我们前面介绍过的编码封装。VLC作为播放器就是解开封装的文件和解码,而利用VLC推流实际是使用了他的输出功能。

Streaming HowTo/Advanced Streaming Using the Command Line 这个WIKI详细介绍了相关的命令。

作为输出流包含很多不同的模块,每个模块有不同的功能:
– standard:把输入的流流输出到文件、UDP、HTTP,一般是在处理的最后一环使用 (我们前面就是用这种方法)
– transcode:对输入的流进行解码然后重新编码。
– duplicate:允许把输入的流复制一份独立的输出流,这样可以对统一输入流做不同的处理,比如把监控视频推送到不同的地方。
– rtp: 可以通过RTP、RTSP来输出。
– es: 说是可以把Elementary Streams(视频、音频或者字母流) 从输入流中提取出来,一般用户把这些独立的流保存到独立文件中。

每个模块都有参数可以设置,比如前面设置的,使用了standard模块,并且设置了相关的参数。

cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264

而模块可以串行使用, 比如下面,先转码,然后输出:

% vlc input_stream --sout '#transcode{options}:standard{options}'

具体的参数WIKI上比较详细了

VLC & RTMP

看完了WIKI也没介绍到如何推流到RTMP。在它的WIKI上搜索了一下,有一篇关于RTMP的文章:https://wiki.videolan.org/RTMP/

VLC supports RTMP and rtmp:// URLs as of version 1.1, through the avio module via the libavformat library. In past versions, use of rtmpdump was required in conjunction with VLC, but that is no longer needed after VLC 1.1.x.

VLC 1.1版本之后就通过avio模块支持了RTMP, 利用的是libavformat库。所以我们能播放RTMP流。https://wiki.videolan.org/Libavformat/ 所以实际是利用的FFmpeg库来转码封装。

经过在网上查找,终于找到了通过VLC推流的命令

sudo raspivid -o - -t 0 -w 640 -h 360 -fps 24 | cvlc -vvv stream:///dev/stdin --sout '#standard{access=rtmp,mux=ffmpeg{mux=flv},dst=rtmp://www.xxxx.cn/live/11}' :demux=h264

这里access填写rtmp,而mux写为ffmpeg{mux=flv}, 这里是使用ffmpege进行了转换。 在PC或者手机端使用VLC就能看到监控画面了,但是延迟在10s左右,考虑到从本地摄像头获取监控观看,也有5s足有延迟,所以RTMP网络延迟应该也是在5s左右。


三 FFMPEG

前面一直都是利用raspivid 程序从摄像头获取数据,而FFMPEG作为一个强大的音视频处理软件,可以直接从摄像头读取数据的。

A complete, cross-platform solution to record, convert and stream audio and video.


摄像头设备

对于Linux系统来说,设备都在/dev目录下,但是树莓派了连接了摄像头之后默认不会生成设备文件。需要手动配置一下。

sudo vi /etc/modules-load.d/modules.conf

在文件最后加上bcm2835-v4l2, 然后重启树莓派。 这个文件指定了在系统启动时需要加载的kernel 模块的名字。

树莓派中的camera module是放在/boot/目录下以固件的形式加载的,不是一个标准的v4l2的摄像头ko驱动,所以加载起来之后会找不到/dev/video0的设备节点。这是因为这个驱动是在底层的,v4l2这个驱动框架还没有加载,所以要在/etc/modules里面添加一行bcm2835-v4l2(是4L2,不是412,小写的L),这句话意思是在系统启动之后会加载bcm2835-v4l2这个模块,这个模块在树莓派系统的/lib/modules/xxx/xxx/xxx下面,添加之后重启系统,就会在/dev/下面发现video0设备节点了。

原文:https://blog.csdn.net/cient007/article/details/52022406

重启之后就可以找到设备文件了

➜  ~ ll /dev/video0
crw-rw---- 1 root video 81, 0 May 29 00:17 /dev/video0


推流

直接使用ffmpeg命令进行推流, 客户端可以正常观看

ffmpeg -f video4linux2  -r 12 -s 640x480 -i /dev/video0 -vcodec libx264 -f flv rtmp://www.xxxx.cn/live/11


保存视频

ffmpeg支持一个输入多个输出,我们直接在上面命令后面增加一个输出home.mp4

ffmpeg -f video4linux2  -r 12 -s 640x480 -i /dev/video0 -vcodec libx264 -f flv rtmp://www.xxxx.cn/live/11 home.mp4

执行后显示2个输出流

Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
  Stream #0:0 -> #1:0 (rawvideo (native) -> h264 (libx264))

使用VLC可以正常观看直播监控,本地保存的视频也是可以看的

FFMPEG的功能非常强大,可以使用命令行也可以使用代码编程,而命令行也是非常复杂。 有需要可以参考官方的文档: https://ffmpeg.org/ffmpeg-all.html


总结

这一篇主要是在树莓派上实现了推流,并进行了保存。这样一个视屏监控的雏形就基本有了。 还有许多可以做的工作,比如我想看监控的时候才需要树莓派进行推流,保存的视频文件按小时或天,分文件保存等等。 最后目前监控只有视频,没有声音,目前手头还没有麦克风来录制音频,后面有时间弄一下。

另外一般小米,360之类的监控还有云端保存,这个相对就比较简单,云端也可以使用VLC或FFMPEG对文件进行保存。 另外目前还缺少身份验证,这样任何人都可以往我的服务器推流和查看, 后面加上鉴权。 现在可以监控我猫了。


如果本文对您有帮助,可以扫描下方二维码打赏!您的支持是我的动力!
微信打赏 支付宝打赏

1 评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注