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

深入理解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的官方实现服务.官网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地址: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性能对比,这里我们选择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地址: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,只使用手机系统的硬编码器,后续还在不断的优化和迭代,欢迎大家体验使用,一起参与维护.

相关推荐
应用市场1 小时前
离线小游戏做“每日挑战”:日期当随机种子,整局存成 JSON,再加一个“我不是机器人”
android·kotlin·游戏开发
一铭111992 小时前
海豹办公 1.9.15 跨端办公软件实践 文档兼容 Access 数据库与移动 WebView 排错
android·数据库·electron·开源软件·access
AI视频工具指南2 小时前
怎么用 AI 做一两分钟的小故事视频?从结尾倒推故事
人工智能·aigc·音视频
geats人山人海3 小时前
java 7异常
android·java·开发语言
AI视频工具指南3 小时前
AI短剧怎么做?一个矛盾怎样接着讲三集
人工智能·aigc·音视频
酷虎软件3 小时前
视频加字幕怎么制作
java·前端·音视频
2601_962071004 小时前
Kimi K3 vs DeepSeek V4-Pro实测对比:2026年同一入口十道题,耗时与token消耗差在哪
android·java·数据库
码点滴4 小时前
67000 星的开源语音引擎:用 VoiceStudio 搭建本地语音克隆与多语言配音流水线
开源·音视频
开开心心就好5 小时前
手机虚拟化学实验室,混合燃烧都能模拟
jupyter·智能手机·ffmpeg·计算机外设·电脑·音视频·visual studio
右手吉他5 小时前
高通平台IA APN问题分析之二
android·物联网