深入理解rtmp(一)之开发环境搭建

简介: SRS(Simple Rtmp Server)定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码,这是该产品自己官方的介绍。值得一说的是,前面几个产品都是国外的,而这个作者是国内的,目前作者在阿里.

image.png


手机直播在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的官方实现服务.官网Adobe Media Server family,但是它是收费的.可以使用,最开始使用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地址:github.com/j0sh/crtmps… ,已经有八九年没有维护了
  • 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://github.com/ossrs/srs &&
cd srs/trunk


下载太慢可以选择国内镜像:git clone https://gitee.com/winlinvip/srs.oschina.git

Step 2: 配置docker环境


编译方式选择使用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


Step 3: 编译srs


在docker中编译


./configure && make


Step 4: 运行srs


./objs/srs -c conf/srs.conf


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,安装好后准备一个待推流视频,执行下面命令:


ffmpeg -re -i ./kobe.mp4 -vcodec copy -acodec copy -f flv -y rtmp://127.0.0.1:1935/live/livestream


其中:


  • -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地址:github.com/bilibili/ij…, 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,只使用手机系统的硬编码器,后续还在不断的优化和迭代,欢迎大家体验使用,一起参与维护.


目录
相关文章
|
10月前
|
Web App开发 前端开发
ZLMediaKit解决webrtc前端replaceTrack断流问题
ZLMediaKit解决webrtc前端replaceTrack断流问题
|
数据采集 开发工具 图形学
Android平台实现Unity3D下RTMP推送
像Unity3D下的RTMP或RTSP播放器一样,好多开发者苦于在Unity环境下,如何高效率低延迟的把数据采集并编码实时推送到流媒体服务器,实现Unity场景下的低延迟推拉流方案。
157 0
|
18天前
|
编解码 API 数据安全/隐私保护
FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播
【9月更文挑战第21天】本文介绍了如何使用FFmpeg和EasyPusher实现移动端RTSP直播。首先概述了EasyPusher的功能及其API,接着详细描述了安装FFmpeg、获取EasyPusher库、初始化对象、打开输入流、配置推送参数及读取推送帧的具体步骤,并提醒开发者注意网络环境、编码参数和权限管理等问题,以确保直播质量与稳定性。
|
4月前
|
网络协议 Shell Windows
搭建rtmp流媒体服务器的步骤
网络上很多问文章介绍使用ffmpeg推送和拉流,经常遗漏安装rtsp-simple-server的步骤,执行推流命令:
225 0
|
3月前
|
Web App开发 缓存 Linux
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
《FFmpeg开发实战》书中第10章提及轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适合生产环境。推荐使用SRS或ZLMediaKit,其中SRS是国产开源实时视频服务器,支持多种流媒体协议。本文简述在华为欧拉系统上编译安装SRS和FFmpeg的步骤,包括安装依赖、下载源码、配置、编译以及启动SRS服务。此外,还展示了如何通过FFmpeg进行RTMP推流,并使用VLC播放器测试拉流。更多FFmpeg开发内容可参考相关书籍。
82 2
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
|
4月前
|
Web App开发 安全 Linux
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
《FFmpeg开发实战》书中介绍轻量级流媒体服务器MediaMTX,但其功能有限,不适合生产环境。推荐使用国产开源的ZLMediaKit,它支持多种流媒体协议和音视频编码标准。以下是华为欧拉系统下编译安装ZLMediaKit和FFmpeg的步骤,包括更新依赖、下载源码、配置、编译、安装以及启动MediaServer服务。此外,还提供了通过FFmpeg进行RTSP和RTMP推流,并使用VLC播放器拉流的示例。
203 3
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
|
4月前
|
编解码 Linux iOS开发
FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流
OBS(Open Broadcaster Software)是一款开源、跨平台的直播和和Linux。官网为<https://obsproject.com/>。要使用OBS进行直播,需执行四步:1) 下载并安装OBS Studio(<https://obsproject.com/download>),2) 启动流媒体服务器如MediaMTX,生成RTMP推流地址,3) 打开OBS Studio,设置直播服务为自定义RTMP服务器(127.0.0.1:1935/stream),调整视频分辨率,4) 添加视频来源并开始直播。同时,通过FFmpeg的拉流程序验证直播功能正常。
122 4
FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流
|
4月前
|
Web App开发 移动开发 编解码
FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo
本文讨论了实时数据传输在互联网中的重要性,如即时通讯和在线直播。一对一通信通常使用WebRTC技术,但一对多直播需要流媒体服务器和特定协议,如RTSP、RTMP、SRT或RIST。RTMP由于其稳定性和早期普及,成为国内直播的主流。文章通过实例演示了如何使用OBS Studio和RTMP Streamer进行RTMP推流,并对比了不同流媒体传输协议的优缺点。推荐了两本关于FFmpeg和Android开发的书籍以供深入学习。
64 0
FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo
|
编解码 网络协议 Android开发
Android平台RTMP|RTSP直播播放器功能进阶探讨
很多开发者在跟我聊天的时候,经常问我,为什么一个RTMP或RTSP播放器,你们需要设计那么多的接口,真的有必要吗?带着这样的疑惑,我们今天聊聊Android平台RTMP、RTSP播放器常规功能,如软硬解码设置、实时音量调节、实时快照、实时录像、视频view翻转和旋转、画面填充模式设定、解码后YUV、RGB数据回调等:
177 0