一起玩树莓派3 + 重磅: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命令行来实现。说这么多,还是直接上图吧:

有图才有真相,注意上图中第二个红色方框框出来的部分是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当监控摄像头的,如果我去上班了,不能看家里的情况,还有什么意义呢?那么问题来了,我在外面怎么连接树莓派上的rmpt服务器呢

且不要着急,有办法的。只不过折腾多一点罢了。当然这有几点前提:电信宽带,路由器拨号,路由器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,可以看到是一致的。

(0)

相关推荐