手机直播在15年的时候突然火起来,随着花椒,映客等出现,直播一下就出现在了风口,各个公司针对直播的战斗迅速打响,战斗过程比较短暂,随着许多公司的退出和死去,手机直播行业趋于稳定,直播服务时长也被传统的CDN厂商牢牢占据,后面大家又把精力投入到互动直播上面,当时一下对手机直播失去了信心.现在随着5G时代的到来,VR技术的兴起,就像15年前的短视频,在17年以后又开始发力一样,直播可能还会迎来它的第二春.趁着有点时间,准备再把直播领域的东西捡起来,从协议实现到编码到采集,逐渐深入并分享出来.
工欲善其事必先利其器,今天先搭建一套完整的服务系统,从采集推流到服务处理到播放端.
先来搭建服务端
常用的rtmp服务器有:AMS(FMS),wowza,Red5,SRS,crtmpserver,nginx.
综合上面描述,对于我们选型最好的是SRS与Nginx-rtmp-module,关于这两种开源实现,SRS作者成立2020/01/19刚做了fork对比:
SRS有略微优势,关于性能对比可以参考srs之与nginx-rtmp性能对比,这里我们选择SRS作为RTMP服务.作者提供了docker环境,我们根据官网在mac上搭建我们的SRS服务:
git clone https://github.com/ossrs/srs &&
cd srs/trunk
下载太慢可以选择国内镜像:git clone https://gitee.com/winlinvip/srs.oschina.git
编译方式选择使用docker,作者提供了docker,可直接使用:
docker pull ossrs/srs:dev
在srs目录下启动docker:
docker run -it -v `pwd`:/tmp/srs -w /tmp/srs/trunk -p 1935:1935 \
-p 1985:1985 -p 8080:8080 -p 8085:8085 ossrs/srs:dev bash
Note: Recommend to use AliyunCR registry.cn-hangzhou.aliyuncs.com/ossrs/srs:dev, because it’s much faster.
可以使用如下方式在新窗口进入该docker容器:
dockerID=`docker ps --format "{{.ID}} {{.Image}}" |grep 'ossrs/srs:dev' |awk '{print $1}'` &&
docker exec -it $dockerID bash
在docker中编译
./configure && make
./objs/srs -c conf/srs.conf
To run docker with --privileged for GDB, or it fail for error Cannot create process: Operation not permitted.
服务端搭建好了,我们接下来就是把音视频流推送到服务器.在PC上我们最常用的推流程序是ffmpeg与OBS:
在mac上我们可以通过brew install ffmpeg
安装ffmpeg,安装好后准备一个待推流视频,执行下面命令:
ffmpeg -re -i ./kobe.mp4 -vcodec copy -acodec copy -f flv -y rtmp://127.0.0.1:1935/live/livestream
其中:
执行效果:
直接安装obs后:
点击设置->串流,配置rtmp地址:
确定后点击"开始串流"就可以将我们的摄像头画面推送的rtmp服务器.
在移动端有一些其它的实现的推流器,但是都没有PC上面的两款方面,后面我们自己实现一个Android/iOS的推流程序.
PC端最常用最好用的rtmp播放器莫过于ffplay与vlc,虽然他们有延迟高等缺点,但是不妨碍我们平时的开发调试:
安装ffmpeg后自带ffplay,直接ffplay rtmp://127.0.0.1:1935/live/livestream
就可以正式看片了,直接上效果:
vlc更简单了,打开vlc, 按下cmd + n
,选择Network输入我们的直播地址就可以开始了:
在移动端最流程的莫过于ijkplayer,github地址:https://github.com/bilibili/ijkplayer, ijkplayer基于ffmpeg,Features:
Common
remove rarely used ffmpeg components to reduce binary size config/module-lite.sh
workaround for some buggy online video.
Android
platform: API 9~23
cpu: ARMv7a, ARM64v8a, x86 (ARMv5 is not tested on real devices)
api: MediaPlayer-like
video-output: NativeWindow, OpenGL ES 2.0
audio-output: AudioTrack, OpenSL ES
hw-decoder: MediaCodec (API 16+, Android 4.1+)
alternative-backend: android.media.MediaPlayer, ExoPlayer
iOS
platform: iOS 7.0~10.2.x
cpu: armv7, arm64, i386, x86_64, (armv7s is obselete)
api: MediaPlayer.framework-like
video-output: OpenGL ES 2.0
audio-output: AudioQueue, AudioUnit
hw-decoder: VideoToolbox (iOS 8+)
alternative-backend: AVFoundation.Framework.AVPlayer, MediaPlayer.Framework.MPMoviePlayerControlelr (obselete since iOS 8)
考虑到ffmpeg的复杂性和庞大的体积,我自己开发了oarplayer,github地址https://github.com/qingkouwei/oarplayer,没有使用ffmpeg,只使用手机系统的硬编码器,后续还在不断的优化和迭代,欢迎大家体验使用,一起参与维护.