去年的时候,入手了一个树莓派,尝试着利用树莓派来推送直播。在这之前,网上已经有人做了相关的实验,从他们的结果来看,树莓派的解码能力已经超出我的预期,正好手上有点资源,我也想着来榨干树莓派的性能。
1. 编译安装
推送直播要用到的最重要的工具就是ffmpeg了,这个真的是一个万能的影音工具。编译安装的过程并不复杂,网上都有教程,不过由于时效性,有些教程已经不合时宜,尽量选择稳定的源码,不要着急装最新版的,问题应该不大。
除了安装ffmpeg之外,还需要安装libx264用于编解码视频,尽量使用源码编译安装。
2. 使用方法
简单地使用ffmpeg来推送直播,用下面这一行命令就足够了:
1 | ffmpeg -re -i ./input.mp4 -c:v copy -c:a copy -flv rtmp:xxxx |
简单分析这行命令,-re
是必须加上的,其意味着保持同步,也就是在推送直播流的时候,是按照时间同步推送的。-i
自然就是输入的对象,-c:v
和-c:a
就是指输入文件的视频video
与音频audio
两个轨道。copy
表示直接复制视频流和音频流,-flv
表示打包的格式为flv格式,最后接的rtmp就是直播地址。
注意
值得注意的是,如果输入文件的音频流或视频流不满足flv格式的标准,那么直接copy是会出问题的。一般来说,这种情况就要对原始视频文件进行重编码,即转码。
3. 直播协议
正如上面所说,简单的进行copy
会导致很多问题,这主要是因为rtmp
协议是使用的是flv
视频格式。这里简单科普一下常见的两种直播协议,一种是HTL,即Http live Streaming,引导者是苹果公司;另外一种就是rtmp,即Real Time Messageing Protocol,是Adobe公司提倡的。
这两种协议的原理也并不复杂,HLS协议的处理过程是首先每隔一段时间将传输过来的视频封装成一块块的TS格式的文件,然后通过m3u8
后缀的索引文件将对应的TS文件推送播放。所以很多直播源以.m3u8结尾
也就是这个道理。而RTMP则不同,在进行推流的过程中,服务器并不用生成块文件,而是直接推送到播放端,更体现了流媒体中 流 的意味。这样的好处就是延迟很小。但同时它要求封装视频的格式为flv,这样也就会带来诸多不便。对于原始就是flv标准格式的视频当然就不用进行任何操作,直接推送即可,但是对于那些不符合标准的视频,就要进行一些预处理。