树莓派3b+音视频学习

http://bbs.eeworld.com.cn/thread-503659-1-1.html

 

1.配置Raspbian

1.中文输入法安装及设置 
sudo apt-get install fcitx fcitx-googlepinyin 
fcitx是一个输入法管理工具,大部分输入法基于该工具开发,当然也还有其他输入法管理工具,不做讨论。fcitx-googlepinyin就是fcitx版的谷歌拼音输入法啦,简洁快速的输入法,就这么装好了。装好之后再做点小小的设置,先重启一下,然后点击树莓图标->Preferences->Fctix Configuration进入如下图所示的输入法管理工具。
 
点击左下角的“+”图标,然后去掉 Only Show Current Language,在下面输入google直接搜索出来google pinyin输入法,点击OK即可添加该输入法,然后可以直接按Ctrl+空格切换中英文输入法了。这里英文输入法默认使用的是UK键盘布局,发现跟US美式布局是有点不一样的,比如想打“\”符号,戳完这个键之后,诡异的打出了“#”,真是哔了dog。我也是过了好久才发现这个问题,当时感觉莫名奇妙,去输入法管理工具中选中UK版的输入法,按“-”号删掉,再按“+”添加US版的输入法,就好了。
Ps.  谷歌拼音输入上下翻译选词使用的不是 < 和 > 按键,而是 - 和 + 按键。 

2.截图工具安装及使用
系统默认没有截图工具,需要自己安装scrot,安装方法为Terminal中输入命令
sudo apt-get install scrot
使用方法,最简单的是按 Print Screen键,会自动截图保存到用户home目录下,如果需要区域截图,需要打开Terminal,然后输入scrot -s命令,再拖动鼠标即可,截好的图片照样会保存在home目录。稍微麻烦点,但是很好用。

3.vi编辑器设置 
vi/vim编辑器在linux中是非常常用的文本编辑工具,但不一定好使,比如编辑的时候可能按方向键会出现莫名奇妙的字符,还有按backspace退格键也可能没有任何作用。修正方法,Terminal中输入 sudo vi /etc/vim/vimrc.tiny 使用vi打开vi的配置文件来修正配置,是不是有点诡异?没关系,能行的。然后按Esc键进入vi编辑器的命令模式, 输入 :set nocompatible (注意不要忘记前面的 : 符号)命令,回车, 此时方向键暂时可以正常使用了,然后按Esc键,输入 :set backspace=2 ,此时删除键也能临时工作了。
然后按方向键找到 配置文件的 set compatible 一行,按i键进入编辑模式, 将它改为 set nocompatible (注意不要带 : 号哦)
完了在下一行输入 set backspace=2 ,好了,按Esc键,再键入 :x 保存并退出vi, 以后vi就可以正常使用了。

4.音频输出设置
心痒痒总是想测试一下树莓派播放音频,由于我使用了有源hdmi转vga转接线,该线与普通的转接线不同的是,还带有3.5mm耳机插孔,可以输出音频,但是连上显示器后,无论是耳机插树莓派上的耳机接口,还是插hdmi转换器上的耳机接口,都没有声音输出。好郁闷,找了好久,终于找到了解决办法,大概可能是树莓派自带的耳机接口除了输出音频外,还附带有RCA(电视a/v输出)功能,会导致音频输出质量很差,有杂音,所以系统默认禁止了该音频输出功能。而hdmi输出又有hdmi模式和vga模式,我使用了hdmi转vga转换器,默认变成了vga模式,是没有音频输出功能的。怎么办呢?修改下配置文件就能搞定了。Terminal下输入
sudo vi /boot/config.txt  ,编辑配置文件。
找到 "#hdmi_drive=2" 一行,将前面的#号删掉,然后保存,重启系统,就可以愉快的输出声音啦,听歌看视频啥的,音质也还不错哦。
 

 

2.音视频简单介绍

首先简单介绍一点音视频的基础,算交代背景吧。声音和图像是我们来了解这个世界的重要通道,我们有两只耳朵,两只眼睛,可想而知他们的重要性。自然界中的声音和图像是模拟的,那么这些是怎么变成我们的平时熟悉的音频、图像、视频文件的呢?     早期记录这些信息也是使用的模拟的方式存储,留声机、黑胶唱片、磁带、胶卷、电影胶片等都属于模拟的方式,很多人认为模拟的方式最接近自然,最能还原本真。所以很多人偏执爱黑胶唱片、胶卷摄影,甚至好莱坞有导演组成联盟拯救柯达,承诺一定的胶卷购买量来拍电影,防止胶片从历史上消失。如果真如这些偏执狂发烧友所认为的,那对数字时代的我们来说也许是一种悲哀,技术更替,却把更好的东西淘汰掉了。anyway,我们今天要讲的是0和1相关的数字时代的音视频。数字时代我们有cd、mp3、mp4、vcd、dvd、电脑、手机、vr、ar各种,照样乐此不彼。。。。    那么我们日常看到的电影或视频是怎么来的呢?或者由什么组成的呢?此处以非常流行的Matroska格式为例,简称mkv,似乎现在大家下载高清电影都先看一下是不是mkv,成了某种意义上的高清代名词,其实这个都是误解。说它主要是因为Matroska属于开源免费的格式,而且支持的编码格式非常全,基本就是个万能格式,所以能这么流行。另外还有大家非常熟悉的mp4,rmvb,flv,avi,3gp等。。。请看下图:(注意区分视频文件和视频)
 

mkv文件为视频文件格式video file format,也叫容器格式(container format),也叫数字容器格式(digital container format),其作用本质就是一个将需要的所有数据放入到一个文件中。所谓容器格式就是将各种不同类型的多媒体数据封装到一起,变成一个文件。mkv文件可以包含无限制的图片、视频、音轨、字幕,甚至还支持3d视频(mk3d),非常强大的容器格式。容器里面包含的就是媒体啦,最主要的就是视频、音频、字幕了,mkv格式支持将n路视频、音频、字幕封装到一起,多路的概念怎么理解呢?就是一个文件中,同时存在多个相同类型的媒体,就拿字幕来说,即可以加入英文字幕,也可以加入中文字幕,音频也一样,同一个电影文件,可以播放不同的配音,这在发布电影的时候非常方便,一个文件,可以针对很多不同国家的观众,只要播放的时候按需选择就可以了。至于多路视频,一般比较少见,我能想到的应用场景就是3d视频了,左右眼两路分别封装到同一个mkv文件中(fang:还有一种是将不同分辨率的视频混在一起,观众根据网络情况选择高清或普清)。


音轨、视频、字幕等经过复用mux封装到同一个容器中,播放的时候demux解复用就可以得到各自的数据。那得到的这些数据是什么呢?音频当然就是录音得到的啦,视频当然就是录像得到的啦,字幕么,手打的(嗯,一定是这样!)。但不是简单的录音、录像得到数据就直接mux到容器中去的。这里就涉及到很重要的编码概念了。前面说过自然界的信息都是模拟信号,而我们计算机只处理数字信号,所以我们采集到的信号会通过模数转换(ADC),但是转换之后是什么呢?我们叫它原始(raw)数据,当然这些数据也有一定的格式,比如音频是PCM,视频呢,大多数传感器出来之后的数据是yuv格式的数据。但是这些数据非常的大,尤其是视频。
常见PCM格式:每秒44100次采样,每次采左右声道,一个声道用16bit表示。1s数据量44100*2*16/8 byte=176400B 戳这里进一步了解
常见YUV格式:每秒采集25帧图像,每张一定分辨率(如720p的分辨率1280x720)的图像用Y、U、V3个通道表示一个点,1s数据量为 1280*720*3/2*25 Byte=34560000B   戳此进一步了解
如此大的数据量,存储和传输都是很大的问题,所以就需要想方设法减少大小。没错,用压缩,但不是用zip这样的方法压缩,而是用更极端的方法,在这里我们叫“编码”。通过一套的复杂的算法,将raw数据编码成一定格式的数据,能大大减少音视频数据的大小。编码分有损和无损,有损编码之后的数据再解码会丢失一定的数据,而无损则不会,解码出来的数据跟raw数据一摸一样。常用的音频编码算法有mp3、aac、gsm、flac、ape等,视频编码算法有mpeg4、h263、h264、h265、vp8、vp9等。编码一般一次编码指定大小或时间的数据,音频以一定数量的采样点为单位编码,比如aac编码要求一次1024个采样点,而视频则以帧为单位,一幅图像编码一次。
编码之后的数据附加上时间戳之后,再经过上面说的mux,将不同的类型、轨道的数据按一定的顺序交错存入文件,就得到了我们平时看到的视频文件。
当然字幕也有很多的编码格式,用于显示不同的位置、样式、颜色等,我们就不讨论了。

绝大部分播放器的灵魂,也是很多音视频相关工程的基石。
后面我会选择h264编码方式编码视频,h264编码由其高压缩率、高质量等特点,非常流行。x264是一个非常优秀的编码器,能集成进ffmpeg,使用上很方便。

 

3.x264和ffmpeg裁剪编译和简单测试

开源项目编译运行大都一个套路模式,基本都是configure, make, make install。不涉及交叉编译(pc端交叉编译、下载到板卡,再运行调试),因为树莓派本身已经集成了我们所需的编译环境,所有工作都可在一块小小的板子上完成。

 

git下载ffmpeg:
git clone git://source.ffmpeg.org/ffmpeg.git   (或者 wget http://ffmpeg.org/releases/ffmpeg-3.3.2.tar.bz2)(低版本ffmpeg配高版本x264可能会有报错,所以还是git clone 吧)

 

git下载x264:
git clone git://git.videolan.org/x264.git 

 

另外ffmpeg中的播放器程序ffplay依赖sdl来显示视频,sdl是一个图形显示库,安装命令: 
sudo apt-get install libsdl2-dev

 

然后进入相应目录通过执行./configure –help可以查看帮助信息,如果执行configure配置出错的时候,可以查看ffmpeg源码目录下的config.log文件,此文件提供完整的出错信息。configure执行成功后,会打印配置信息表,一目了然。

 

x264配置(config_x264_rpi.sh):

#!/bin/sh
#  build x264 for raspberrypi

./configure \
--disable-shared --enable-static \
--enable-strip \
--disable-cli

# disable shared(.so) & enable static(.a) library 
# strip binary, optimize for size.
# disable x264 exection binary for speed.

 

x264编译:
chmod +x config_x264_rpi.sh
./config_x264_rpi.sh
make -j4
sudo make install   #sudo不加安装不上。。。


ffmpeg配置(config_ffmpeg_rpi.sh)
ffmpeg通过configure生成Makefile,同时configure也担当编译配置的作用,
由于默认的configure配置会编译几乎所有的代码文件,编译出来的库文件和程序文件都非常大,这在树莓派3上是一项相当大的工作,4核满负荷工作也需要大概20多分钟。而且默认配置是没有使能树莓派的硬件编解码加速的,所以需要做一定的配置。通过下面的脚本配置后,编译ffmpeg的时间可以缩减到10分钟以内,这个还是可以接受的,所以普通的开发工作可以直接在树莓派上完成,非常方便,给树莓派点个赞。
其中有两个比较关键的东西叫omx-rpi和mmal:
omx-rpi 树莓派的硬编码加速
mmal     树莓派的硬解码加速

(fang:因为树莓派就是一个miniPC了,我们可以直接在树莓派上使用ffmpeg提供的命令行进行音视频操作,所以这里他配置ffmpeg ffplay ffprobe ffserver都enable了。如果使用ffmpeg作为库进行二次开发,ffplay等几个应用ap应该是不要的)


#!/bin/sh
# build ffmpeg for raspberrypi (tested on rpi3)
# v0.1.1-20161129

PREFIX=/usr/local

./configure \
--enable-gpl    --enable-version3 --enable-nonfree \
--enable-static --disable-shared \
\
--prefix=$PREFIX \
\
--disable-opencl \
--disable-thumb \
--disable-pic \
--disable-stripping \
\
--enable-small \
\
--enable-ffmpeg \
--enable-ffplay \
--enable-ffserver \
--enable-ffprobe \
\
--disable-doc \
--disable-htmlpages \
--disable-podpages \
--disable-txtpages \
--disable-manpages \
\
--disable-everything \
\
--enable-libx264 \
--enable-encoder=libx264 \
--enable-decoder=h264 \
--enable-encoder=aac \
--enable-decoder=aac \
--enable-encoder=ac3 \
--enable-decoder=ac3 \
--enable-encoder=rawvideo \
--enable-decoder=rawvideo \
--enable-encoder=mjpeg \
--enable-decoder=mjpeg \
\
--enable-muxer=flv \
--enable-demuxer=flv \
--enable-muxer=mp4 \
--enable-demuxer=mpegvideo \
--enable-muxer=matroska \
--enable-demuxer=matroska \
--enable-muxer=wav \
--enable-demuxer=wav \
--enable-muxer=pcm* \
--enable-demuxer=pcm* \
--enable-muxer=rawvideo \
--enable-demuxer=rawvideo \
\
--enable-parser=h264 \
--enable-parser=aac \
\
--enable-protocol=file \
--enable-protocol=tcp \
--enable-protocol=rtmp \
--enable-protocol=cache \
--enable-protocol=pipe \
\
--enable-filter=aresample \
--enable-filter=allyuv \
--enable-filter=scale \
\
--enable-indev=v4l2 \
--enable-indev=alsa \
\
--enable-omx \
--enable-omx-rpi \
--enable-encoder=h264_omx \
\
--enable-mmal \
--enable-hwaccel=h264_mmal \
--enable-decoder=h264_mmal

 

ffmpeg编译:
chmod +x config_ffmpeg_rpi.sh   

先安装  sudo  apt-get install libomxil-bellagio-dev   (不然会报告  ERROR: OMX_Core.h not found)
./config_ffmpeg_rpi.sh   (貌似会报告一个 WARNING: Option --enable-hwaccel=h264_mmal did not match anything)
make -j4
sudo make install

 

ffmpeg -version 测试一下

输入ffmpeg并回车,可以看到有h264_omx和h264_mmal字样,说明ffmpeg已支持树莓派的H.264硬件编解码器。

那俩配置脚本在网上:https://blog.csdn.net/qq_28877125/article/details/70186287  https://www.jianshu.com/p/dec9bf9cffc9

https://blog.csdn.net/realdonaldtrump/article/details/78617502

 

4.源码搭建nginx+rtmp服务器和简单测试

nginx(Engine X)是一个很流行的web服务器,以小巧、稳定、并发能力强著称。很多大公司服务器都用的这货,比如eeworld论坛:  
rtmp(Real-Time Messaging Protocol)是由Micromedia开发的一种流媒体传输协议,已归入Adobe,最先是为了播放Flash视频而开发的。是目前直播行业用的非常多的一种流媒体传输协议,有成熟的cdn加速用于分布式大并发和流量加速,是直播行业的主流解决方案。rtmp的服务器有很多,比如Adobe自己的商业服务器FMS,另有一些其它的开源解决方案,我最终选用的是nginx。因为nginx除了做web服务器外,另外有很多的插件(Module)支持,用于功能扩展。其中就用ngnix-rtmp-module,用于搭建rtmp server,实现视频点播和直播功能。接下来就我们在树莓派上搭建一个nginx服务器+rtmp流媒体服务器吧。

nginx+rtmp编译:

  • 树莓派3官方的Raspbian系统本身就是Linux,具备了绝大部分搭建服务器的条件,只需安装一些必要的支持包即可,主要是nginx的一些依赖。apt-get 用起来也是很方便的,安装命令:
    1. sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
    (fang:这一步安装 libpcre3-dev 的时候,会提示 libpcre3安装的版本较高而报错,按照 https://blog.csdn.net/kxwinxp/article/details/78370980 修改了源后似乎可以安装了,所以软件源提供的工具版本太高会有问题)
  • 下载nginx和nginx-rtmp-module源码,nginx源码下载地址:http://nginx.org/download/,我们可以下载各种版本,这里我们选用最新的1.9.15版本,nginx-rtmp-module可通过github下载,很方便:
    1. wget https://nginx.org/download/nginx-1.9.15.tar.gz  (fang:我下载的 nginx-1.9.9.tar.gz)
    2. git clone https://github.com/arut/nginx-rtmp-module.git
  • 下载完后解压nginx,unzip nginx-1.9.9.zip即可,然后在nginx-1.9.9目录下新建一个extra文件夹,并将nginx-rtmp-module目录移到extra目录下。nginx目录下执行configure:
    1. ./configure --with-http_ssl_module --add-module=./extra/nginx-rtmp-module
  • 再执行make -j4等待nginx编译完成(fang: 这一步可能会因为openssl版本较高报告错误,我 wget https://www.openssl.org/source/openssl-1.0.2p.tar.gz  后 解压,然后重新配置nginx: ./configure --with-http_ssl_module --with-openssl=/home/pi/ffmpeg/openssl-1.0.2p --add-module=./extra/nginx-rtmp-module,然后make成功)。
  • 一切顺利的话,编译成功再执行 sudo make install,将编译好的nginx安装到系统之中,默认安装在/usr/local/nginx目录下。

(fang: 还有一个可以参考的 https://www.cnblogs.com/qiantuo1234/p/6611845.html)

nginx rtmp配置和简单测试:
nginx配置文件在/usr/local/nginx/conf目录下,配置rtmp server功能需要修改该目录下nginx.conf文件,在文件的末尾(大括号之后,不要添加到大括号里面)添加以下内容,需要sudo权限才能修改 sudo vi /usr/local/nginx/conf/nginx.conf:

  1. # rtmp server
  2. rtmp {
  3.  
  4.           server {
  5.                     listen 1935;
  6.                     chunk_size 4096;
  7.  
  8.                     application live {
  9.                             live    on;
  10.                             record  off;
  11.                     }
  12.                     application vod {
  13.                             play /home/pi/Videos;
  14.                     }
  15.             }
  16. }


简单说明一下,这里配置了两个rtmp application,live用于直播,vod用于点播,点播的内容来自于是/home/pi/Videos目录。详细的配置方法可以参考wiki:https://github.com/arut/nginx-rtmp-module/wiki/Directives

nginx启动并测试:
启动nginx很简单,执行 sudo /usr/local/nginx/sbin/nginx 即可。

(fang:    sudo /usr/local/nginx/sbin/nginx                   启动nginx服务器
               sudo /usr/local/nginx/sbin/nginx -s reload    重新加载配置文件
               sudo /usr/local/nginx/sbin/nginx -t                查询nginx配置 

        /usr/local/nginx/sbin/  下存放nginx的可执行文件

        /usr/local/nginx/html/ 下存放nginx的网页文件

        /usr/local/nginx/conf/  下存放nginx的配置文件

        /usr/local/nginx/logs    下存放nginx的log文件             )
下面开始测试nginx是否运行成功了,检测方法是在pc浏览器中输入树莓派的ip地址,访问树莓派3搭建的web服务器,如能看到下图,恭喜你,nginx启动成功了。
 

rtmp点播测试:
这里需要用到特殊的播放器,也就是支持rtmp的播放器,祭出神器vlc(下载戳我),支持各种格式、各种协议、各种硬件加速,功能非常强大,流媒体开发必备。所谓点播,就是在线播放服务器上的视频,前面配置的时候已经配置好/home/pi/Videos为点播目录了,假如Videos目录下有一个test.mp4的文件,那点播地址是什么呢?很简单rtmp://rpi3_ip/vod/test.mp4 ,我们直接在vlc中点击File ->Open Network,然后填入上面的地址就可以啦,不出意外的话,test.mp4文件缓冲一会儿之后就能开始播放啦。。。(fang:整个过程就是vlc调用ffmpeg核,从rtmp协议读取文件并解码播放,rtmp协议服务提供者当然就就是nginx)

 

5.ffmpeg命令行工具使用及视频录制

ffmpeg编译完之后,会产生ffmpeg、ffplay、ffprobe、ffserver四个可执行文件。这是ffmpeg的命令行工具,分别用于转码、播放媒体、查看媒体信息和媒体服务器的功能。
 
这几个工具可以直接在ffmpeg目录下使用./ffmpeg这样的形式执行,如果在编译ffmpeg之后执行sudo make install,这些工具会安装到树莓派3的系统中,这样就可以在任意目录下直接输入ffmpeg、ffplay等执行相应的工具。比如我们直接在用户目录(注意绿色箭头所指~表示home目录)执行一下ffmpeg --help
 
ffmpeg命令工具的用法:
仔细阅读ffmpeg --help显示的帮助信息,上图红框里是查看一些信息类的命令参数,比较重要的是-devices参数,用于查询当前系统的ffmpeg支持的设备,树莓派3上执行之后的结果如下图:
 
我们可以看到,有alsa和v4l2两个设备,alsa用于音频的录制,而v4l2则用于视频采集。
下面对ffmpeg命令的转码功能做一个简单的介绍。转码就是将一种媒体转换为另一种媒体,可以是改变容器格式、码流数量、改变编码格式、或仅仅改变编码参数。转码需要指定输入文件、输出文件和一些相关参数,本质上从摄像头采集视频保存成常见的视频文件,也属于转码,下面我们通过摄像头录像成mp4文件来分析一下其参数用法;

( fang:  ffmpeg -f v4l2 -r 15 -video_size vga -pix_fmt yuv420p -i /dev/video0 -b:v 500k -c:v h264 -an -f mp4 picam.mp4 -y  ,不知到为啥,使用vlc播放录制的mp4文件似乎播放不出来。。。 )
 
ffmpeg参数以分组的方式传人,上图中黑色箭头和绿色箭头之间表示输入格式部分的参数,绿色箭头和红色箭头之间则是输出格式的参数,这里相当于摄像头(输入)->mp4文件(输出)的转换,我们分别指定好输入和输出的参数,然后以输入输出文件名为该组参数的结尾就行了。这里输入是摄像头,Linux下摄像头驱动文件是/dev/videon,n是数字,支持多个摄像头,数字从0递增。所以我们指定-i /dev/video0为输入文件,并放在该组参数的最后。然后我们再设置摄像头抓数据的一些参数,-f v4l2表示取数据的格式为v4l2,是Linux下的标志摄像头驱动形式。-r 15 表示帧率为15,-video_size vga表示采集分辨率为VGA(640x480),最后-pix_fmt yuv420p表示采集yuv420p格式的元数据。
然后是输出格式的参数,最后的picam.mp4表示输出的文件名,-f mp4表示输出为mp4格式,而然后是-b:v 500k则指定输出文件中的视频码率为500kbps,-vcodec (-v:c)  h264表示输出文件的视频编码采用h264,ffmpeg会自动指定一个可用的编码器,这里我们可以看后面的输出信息,ffmpeg指定了x264作为编码器。另外由于这里我只单采集视频,所以显示指定关闭音频,使用-an参数。
最后么的-y参数表示输出文件如果存在,就自动覆盖,而不询问,否则每次询问是否覆盖。

图中最后的红色方框显示当前转码的信息,当前事第多少帧,帧率有多少,时间,码率,已经speed表示当前速度和期望速度的比值,如果编码过慢,这个值会小于1.

另外简单说一下ffprobe,主要用于查看媒体文件信息,用法为ffprobe -i 文件名。示例:
 

ffplay用法也很简单,ffplay -i 文件名,就可以直接播放视频了。当然需要在gui窗口下才能执行,ssh连接里就不用尝试了,因为没有图形界面,没法播放视频啦。不过树莓派播放视频好像资源好用挺厉害的,分辨率1000多的视频,cpu占用90%+,软解挺忧伤的。

6.H.264硬编码推流实现完整直播功能

先简单介绍一下整个系统的组成:
1.树莓派采集摄像头视频 ->2.硬编码成flv格式 ->3.通过rtmp推流到本机nginx-rtmp服务器 ->4.播放器播放直播视频

其实绝大部分功能我们在前面的篇帖中实现的差不多了,只需做一些小小的改动贯通起来,我们的直播功能就能实现了。当然我们需要更好的效率,所以我们要使用硬编码,速度会快很多,节省树莓派宝贵的cpu资源,当然也更节省能源,绿色环保哦。
前面的帖子已经编译好了ffmpeg,并且是带h264硬编码和硬解码的,这里推流我们需要的是硬编码功能,上篇《一起玩树莓派3 + ffmpeg命令行工具使用及视频录制》中我们知道默认ffmpeg编码使用的是x264编码器,那我们如何指定使用硬件编码器呢?当然是直接指定啦,前面ffmpeg编译的时候我们已经讲过,树莓派的VideoCore IV的硬编码功能已经通过omx接口暴露给了我们,那我们直接指定h264_omx编码器,ffmpeg就可以自己调用啦。真是太方便了!
然后上篇帖子我们已经实现了录制文件到本地,这么推流给nginx-rtmp服务器呢?这里又有一些新的问题了,由于rtmp协议是为flash服务的,如果我们要推流到rtmp服务器,就需要录制flv格式的视频,而且输出不能是文件名了,而要是rtmp服务器的url了.之前我们配置好了nginx实现rtmp直播功能,直播地址根vod点播一样逻辑,rtmp://ip/live/stream_name。ffmpeg的命令行功能非常强大,可以让我们不需要编程,就能实现绝大多数功能。甚至有人直接将ffmpeg可执行文件集成到项目中,然后通过参数调用ffmpeg新建进程来实现需要的功能。比如有的服务器需要实时转码用户的上传的视频,就可以通过ffmpeg命令行来实现。说这么多,还是直接上图吧:

(fang:  ffmpeg -f v4l2 -r 15 -video_size vga -pix_fmt yuv420p -i /dev/video0 -b:v 500k -c:v h264_omx -an -f flv rtmp://192.168.1.17/live/picam  ,这个我在本地实际测试是OK的 )
 
有图才有真相,注意上图中第二个红色方框框出来的部分是rtmp推流跟录制文件的区别,picam是推流时随便指定的流名称,播放器播放时需要跟这个链接相一致。第一个红色方框则是指定omx硬编码加速,绿色方框也提升我们,ffmpeg调用了博通的omx encode。黑色方框可以看到实时的推流状态,从图中可以看出,15fps稳定推流,由于usb摄像头的usb速率限制,高分辨率时fps会有所下降,当时720p 10fps基本没有问题,树莓派3还是让我很惊喜的,如果换成csi接口的摄像头,fps和分辨率都可以开到很高,编码速度方面我相信使用上硬编码也完全没有问题。

推流完成之后,我们如果需要观看直播流怎么办呢?很简单,找个支持rtmp的播放器就行了,本身ffplay也是支持播放的,只需执行ffplay -i rtmp://192.168.15.101/live/picam即可,非常方便。当然还有其它更友好的播放器可以选择了,比如VLC,还能跨平台使用,无论手机、windows、linux、mac都可以。下面上个效果图,注意看树莓派桌面上的cpu占用只有4%哦,虽然看起来有点夸张,单目测平均下来cpu占用就在5%左右,要知道这可是包括了视频采集、编码、推流,更有nginx服务器同时工作,结果相当令人满意,甚至说树莓派3的性能已经超出了我的预期太多!
 
摄像头直接拍摄屏幕,左上角脚窗口为vlc播放的摄像头画面,可以看到延迟有11秒左右,其实真正的延迟很低,大概1.5s左右,只是vlc开了缓冲的缘故,导致延迟很高。

前面的测试都是在局域网中完成的,但是直播怎么能只在家里看呢?那不是没多少意义了!本来我们的初衷就是为了那树莓派3当监控摄像头的,如果我去上班了,不能看家里的情况,还有什么意义呢?那么问题来了,我在外面怎么连接树莓派上的rtmp服务器呢? 不要着急,有办法的。只不过折腾多一点罢了。当然这有几点前提:电信宽带,路由器拨号,路由器wan口ip跟公网ip相同。如果符合以上几点,那公网看家里视频,分分钟能解决的事情,只需做一个端口映射就成。怎么做呢?让你的树莓派直接连接家里宽带拨号的路由器,然后进入路由器设置界面,找到端口映射设置,新增一个 wan口1935的tcp端口到树莓派ip 1935tcp端口的映射,就可以用rmtp://公网ip/live/picam这个链接在任何地方访问树莓派的摄像头了.贴一个我的端口映射设置(我使用的pandora的路由器固件,其它路由器端口映射设置请自行搜素)
 


------------------------- 割一下 --------------------------
本篇通过ffmpeg命令行方式实现了硬编码rtmp直播,其实大多数项目中并不一定是这么做的,比如手机上,就不能直接这么用了,系统限制了一些功能没法使用,比如摄像头采集,没法直接读取v4l2驱动文件,这样的情况就需要自己通过ffmpeg的一系列api了,也就是二次开发,本次测评结束之后,再另开篇讲点二次开发的东西...

PS. wan口ip和公网是否一致查看方法看下图,左边为路由器wan口状态,右边为ip.cn查询到的公网ip,可以看到是一致的。
 

PS+. 友情提示:如果发现wan口不是公网ip,而你又是路由器直接拨号的电信宽带的话,那你可以骚扰一下10000号客服小妹,让电信帮你改成公网ip即可,一般很快就能生效。抛开电信宽带死贵、还特么上下行带宽严重不对等不说,还是要为电信的服务点个赞的

你可能感兴趣的:(树莓派学习)