深入理解 rtmp(一) 之开发环境搭建
手机直播在 15 年的时候突然火起来,随着花椒,映客等出现,直播一下就出现在了风口,各个公司针对直播的战斗迅速打响,战斗过程比较短暂,随着许多公司的退出和死去,手机直播行业趋于稳定,直播服务时长也被传统的 CDN 厂商牢牢占据,后面大家又把精力投入到互动直播上面,当时一下对手机直播失去了信心.现在随着 5G 时代的到来,VR 技术的兴起,就像 15 年前的短视频,在 17 年以后又开始发力一样,直播可能还会迎来它的第二春.趁着有点时间,准备再把直播领域的东西捡起来,从协议实现到编码到采集,逐渐深入并分享出来.
工欲善其事必先利其器,今天先搭建一套完整的服务系统,从采集推流到服务处理到播放端.
先来搭建服务端
RTMP 服务器搭建
常用的 rtmp 服务器有:AMS(FMS),wowza,Red5,SRS,crtmpserver,nginx.
RTMP 是 Real Time Message Protocol(实时信息传输协议)的缩写,是由 Adobe 公司提出的一种应用层协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题.Flash Media Server (简称 FMS),后更名为 Adobe Flash Media Server (简称 AMS)。它是较早(2002 年)做流媒体服务器产品的,原公司是 Macromedia,后来被 Adobe 收购了,它是流视频和实时通信领域业界领先的解决方案,该产品可以快速搭建起一套流媒体直播、点播服务器。AMS 可以说是 rtmp 的官方实现服务.官网https://business.adobe.com/cn/products/primetime/adobe-media-server.html,但是它是收费的.可以使用,最开始使用 AMS 搭建过服务,可以参考FMS教程自己尝试搭建.
wowza 全名是 Wowza Streaming Engine,是一款非常优秀的流媒体服务器产品。也算是除了 FMS 产品之外的一个老版子产品,产品发布于 2007 年,他在 HLS(m3u8)分发方面是非常不错的。从 wowza2.0 到现在的 wowza4.5,都曾关注和使用过他们的产品,总体来说性价比还是蛮高的。同 AMS 一样,它也是需要付费的产品.官网Wowza Live Stream Software,同样参考RED5教程 尝试自己搭建
Red5:免费开源的是它最大的优点,也因此有很多用户在使用它们的产品,然后不足在于占用服务器资源较高。官网Red5 Media Server
crtmpserver 又称 rtmpd 是 Evostream Media Server(www.evostream.com)的社区版本采用GPLV3授权,由 C/C++开发的一个高性能的 RTMP 流媒体服务器,可以实现直播与点播功能多终端支持功能,在特定情况下是 FMS 的良好替代品。支持 RTMP 的一堆协议 (RTMP,RTMPE, RTMPS, RTMPT, RTMPTE),如果你不想用 RED5 的话它也是一个很好的选择。github 地址:https://github.com/j0sh/crtmpserver ,已经有八九年没有维护了
Nginx-rtmp:是作为 nginx 的一个模块部署,官网地址nginx-rtmp,github 地址nginx-rtmp-module
SRS(Simple Rtmp Server)定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码,这是该产品自己官方的介绍。值得一说的是,前面几个产品都是国外的,而这个作者是国内的,目前作者在阿里.
综合上面描述,对于我们选型最好的是 SRS 与 Nginx-rtmp-module,关于这两种开源实现,SRS 作者成立 2020/01/19 刚做了 fork 对比:
SRS 有略微优势,关于性能对比可以参考srs之与nginx-rtmp性能对比,目前作者仍在不断迭代升级,并且有千人群接待问题(如果有兴趣可以加我微信 kouwei_qing 拉你进群).这里我们选择 SRS 作为 RTMP 服务.作者提供了 docker 环境,我们根据官网在 mac 上搭建我们的 SRS 服务:
Step1:获取 srs:
下载太慢可以选择国内镜像:git clone https://gitee.com/winlinvip/srs.oschina.git
Step 2: 配置 docker 环境
编译方式选择使用 docker,作者提供了 docker,可直接使用:
在 srs 目录下启动 docker:
Note: Recommend to use AliyunCR registry.cn-hangzhou.aliyuncs.com/ossrs/srs:dev, because it's much faster.
可以使用如下方式在新窗口进入该 docker 容器:
Step 3: 编译 srs
在 docker 中编译
Step 4: 运行 srs
Step 5: docker 启用 gdb 调试
To run docker with --privileged for GDB, or it fail for error Cannot create process: Operation not permitted.
推流端
服务端搭建好了,我们接下来就是把音视频流推送到服务器.在 PC 上我们最常用的推流程序是 ffmpeg 与 OBS:
ffmpeg 命令方式推流
在 mac 上我们可以通过brew install ffmpeg
安装 ffmpeg,安装好后准备一个待推流视频,执行下面命令:
其中:
-re 按照帧率发送;如果不加,手册里说的是发送 as fast as possible
-i ./kobe.mp4 推送的是当前目录下的 kobe.mp4 文件
-vcodec copy 视频编码为保持原始 kobe.mp4 视频编码,我这个文件是 h264
-acodec copy 音频编码为保持原始 kobe.mp4 音频编码,我这个文件是 aac
-f flv 封装格式是 flv
-y rtmp://127.0.0.1:1935/live/livestream 直接写入到输出文件,这里面是 rtmp 的服务地址
执行效果:
obs
直接安装 obs 后:
点击设置->串流,配置 rtmp 地址:
确定后点击"开始串流"就可以将我们的摄像头画面推送的 rtmp 服务器.
其它
在移动端有一些其它的实现的推流器,但是都没有 PC 上面的两款方面,后面我们自己实现一个 Android/iOS 的推流程序.
播放器
PC 端最常用最好用的 rtmp 播放器莫过于 ffplay 与 vlc,虽然他们有延迟高等缺点,但是不妨碍我们平时的开发调试:
ffplay
安装 ffmpeg 后自带 ffplay,直接ffplay rtmp://127.0.0.1:1935/live/livestream
就可以正式看片了,直接上效果:
vlc
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,只使用手机系统的硬编码器,后续还在不断的优化和迭代,欢迎大家体验使用,一起参与维护.
版权声明: 本文为 InfoQ 作者【轻口味】的原创文章。
原文链接:【http://xie.infoq.cn/article/e98ee13c9cead7e48799f921d】。文章转载请联系作者。
评论