深入理解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,只使用手机系统的硬编码器,后续还在不断的优化和迭代,欢迎大家体验使用,一起参与维护.


目录
相关文章
|
JavaScript 前端开发 API
Node.js中发起HTTP请求的五种方式
以上五种方式,尽管只是冰山一角,但已经足以让编写Node.js HTTP请求的你,在连接世界的舞台上演奏出华丽的乐章。从原生的 `http`到现代的 `fetch`,每种方式都有独特的风格和表现力,让你的代码随着项目的节奏自由地舞动。
1133 65
|
人工智能 安全 数据可视化
Dify让你拖拽式搭建企业级AI应用
Dify是开源大模型应用开发平台,融合BaaS与LLMOps理念,通过可视化工作流、低代码编排和企业级监控,支持多模型接入与RAG知识库,助力企业快速构建安全可控的AI应用,实现从原型到生产的高效落地。
Dify让你拖拽式搭建企业级AI应用
|
编解码 Linux
libfdk-aac和x264安装编译
libfdk-aac和x264安装编译
1507 0
libfdk-aac和x264安装编译
|
物联网 虚拟化 Windows
Windows 10 version 22H2 中文版、英文版下载 (2025 年 7 月更新)
Windows 10 version 22H2 中文版、英文版下载 (2025 年 7 月更新)
1797 0
|
算法
重磅!2025年中科院预警期刊名单正式发布!
中国科学院文献情报中心定期发布《国际期刊预警名单》,旨在防范学术不端和不当出版行为。2025年最新名单聚焦两大问题:一是引用操纵、论文工厂等破坏科研生态的行为;二是中国作者占比过高或APC费用不合理,影响学术成果国际化传播。自2022年起,预警名单调整至年初发布,便于科研人员规划投稿。名单结合定量数据与专家评估,动态反映期刊风险。被列预警期刊可能影响职称评审及科研经费认可,建议优先选择中科院分区表推荐期刊,警惕快速代发陷阱,并关注期刊官网声明。未来,强化学术自律和技术工具应用将助力科研规范化,推动中国学术走向全球。
2092 0
|
存储 JSON Java
含有泛型的 JSON 反序列化问题
含有泛型的 JSON 反序列化问题
2622 0
含有泛型的 JSON 反序列化问题
|
机器学习/深度学习 人工智能 Python
|
存储
流媒体服务器与视频服务器有什么区别?
总的来说,流媒体服务器和视频服务器的主要区别在于,流媒体服务器更注重实时性和并发性,而视频服务器更注重存储和分发。
1341 2
|
移动开发 前端开发 JavaScript
高级前端工程师必备的技能
【7月更文挑战第8天】 **高级前端工程师**精通HTML5/CSS3/JavaScript,擅长React、Vue等框架,掌握性能优化、代码质量保证,能设计可扩展架构,处理前端安全,熟悉跨平台开发,持续学习新技术并领导团队,是技术与管理的结合体。他们对提升用户体验和推动技术创新起关键作用。
1800 12
|
机器学习/深度学习 搜索推荐 语音技术
进阶教程:优化语音克隆效果与提升TTS自然度
【10月更文挑战第20天】语音克隆技术和基于文本到语音(Text-to-Speech, TTS)系统的应用已经在诸多领域展现出了巨大的潜力,从智能助手到个性化客服,再到教育和娱乐产业。作为一名在语音技术领域有着多年实践经验的研发人员,我希望通过本文分享一些我个人在优化语音克隆效果与提升TTS自然度方面的经验和见解,帮助那些已经具备了一定基础并希望进一步提升自身技能的同行们。
1257 0