深入理解rtmp(一)之開發環境搭建

老司機丿發表於2020-01-19

手機直播在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對比:

深入理解rtmp(一)之開發環境搭建

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的服務地址

執行效果:

深入理解rtmp(一)之開發環境搭建
深入理解rtmp(一)之開發環境搭建

obs

直接安裝obs後:

深入理解rtmp(一)之開發環境搭建
點選設定->串流,配置rtmp地址:
深入理解rtmp(一)之開發環境搭建
確定後點選"開始串流"就可以將我們的攝像頭畫面推送的rtmp伺服器.

其它

在移動端有一些其它的實現的推流器,但是都沒有PC上面的兩款方面,後面我們自己實現一個Android/iOS的推流程式.

播放器

PC端最常用最好用的rtmp播放器莫過於ffplay與vlc,雖然他們有延遲高等缺點,但是不妨礙我們平時的開發除錯:

ffplay

安裝ffmpeg後自帶ffplay,直接ffplay rtmp://127.0.0.1:1935/live/livestream就可以正式看片了,直接上效果:

深入理解rtmp(一)之開發環境搭建

vlc

vlc更簡單了,開啟vlc, 按下cmd + n,選擇Network輸入我們的直播地址就可以開始了:

深入理解rtmp(一)之開發環境搭建

其他

在移動端最流程的莫過於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,只使用手機系統的硬編碼器,後續還在不斷的優化和迭代,歡迎大家體驗使用,一起參與維護.

深入理解rtmp(一)之開發環境搭建

相關文章