分享

一起玩树莓派3 + 重磅:H.264硬编码推流实现完整直播功能

 知芯世界 2020-10-28

先简单介绍一下整个系统的组成:
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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多