1. 程式人生 > >視訊協議學習--推流拉流都擅長的RTMP

視訊協議學習--推流拉流都擅長的RTMP

一、rtmp是什麼

從資料瞭解rtmp是一個實時訊息通訊協議,主要的變種功能如下:

1)RTMP工作在TCP之上,預設使用埠1935,這個是基本形態;

2)RTMPE在RTMP的基礎上增加了加密功能;

3)RTMPT封裝在HTTP請求之上,可穿透防火牆

4)RTMPS類似RTMPT,增加了TLS/SSL的安全功能;

5)RTMFP使用UDP進行傳輸的RTMP;

雖然rtmp有很多變種,但實際在我們的直播應用中,常見的是原始的rtmp。rtmp協議中基本的資料單元稱為訊息(Message)。當rtmp協議在網際網路中傳輸資料的時候,訊息會被拆分成更小的單元,稱為訊息塊(Chunk)。Rtmp的互動過程可以理解成獨有的握手過程、控制命令傳輸、音視訊資料傳輸。

二、握手過程

一個 RTMP 連線以握手開始。RTMP 的握手不同於其他協議;RTMP 握手由三個固定長度的塊組成,而不是像其他協議一樣的帶有報頭的可變長度的塊。客戶端 (發起連線請求的終端) 和伺服器端各自發送相同的三塊。便於演示,當傳送自客戶端時這些塊被指定為 C0、C1 和 C2;當傳送自伺服器端時這些塊分別被指定為 S0、S1 和 S2。以下是握手過程中傳遞的包格式介紹:

RTMP握手以客戶端傳送 C0 和 C1 塊開始,客戶端必須接收到 S1 才能傳送 C2,客戶端必須接收到 S2 才能傳送任何其他資料,伺服器端必須接收到 C0 才能傳送 S0 和 S1,也可以等待接收到 C1 再發送 S0 和 S1,伺服器端必須接收到 C1 才能傳送 S2,伺服器端必須接收到 C2 才能傳送任何其他資料。以下為RTMP的握手過程圖介紹:

規範要求RTMP需要一個一個的傳送握手包,但是實際上客戶端傳送C0+C1,服務端傳送S0+S1+S2,再客戶端在傳送C2結束握手。

三、資料包格式

RTMP協議中基本的資料單元稱為訊息(Message)。當RTMP協議在網際網路中傳輸資料的時候,訊息會被拆分成更小的單元,稱為訊息塊(Chunk)。

3.1訊息格式

訊息頭包含以下資訊:

Message Type: 訊息型別,佔用1個位元組。

Length: 有效負載的位元組數,佔用3個位元組。該欄位是用大位元組序表示的。

Timestamp: 時間戳,佔用4個位元組,用大位元組序表示。

Message Stream Id: 訊息流ID,標識訊息所使用的流,用大位元組序表示。

以下是訊息型別的取值介紹,沒有描述的取值說明未使用:

以下是訊息型別中的命令訊息的型別介紹:

3.2分塊格式

握手之後,連線開始對一個或多個塊流進行合併。建立的每個塊都有一個唯一 ID 對其進行關聯,這個 ID 叫做 chunk stream ID (塊流 ID)。這些塊通過網路進行傳輸。傳遞時,每個塊必須被完全傳送才可以傳送下一塊。在接收端,這些塊被根據塊流 ID 被組裝成訊息。

分塊允許上層協議將大的訊息分解為更小的訊息,例如,防止體積大的但優先順序小的訊息 (比如視訊) 阻礙體積較小但優先順序高的訊息 (比如音訊或者控制命令)。分塊還能降低訊息傳送的開銷,它在塊頭中包含了壓縮的原本需要在訊息中所包含的資訊。

塊由塊頭和資料組成,塊頭包含3部分:基本頭、訊息頭和擴充套件時間戳,以下是各部分的介紹:

塊的基本頭包含塊流ID和塊型別(下面的fmt欄位)。塊型別代表了編碼過的訊息頭的格式。此欄位根據塊流ID的不同,長度可能為1,2或3位元組。在實現協議時,此欄位應該使用可以容納ID的最小長度。此協議支援最多65597個流,ID從3到65599。0,1,2這三個為保留ID。當塊的基本頭長度為2位元組時,第3-8位元取值為0。當長度為3位元組時,第3-8位元取值為1。塊流ID為2時保留作為低階協議的控制訊息和命令訊息。以下是基本頭的每個佔位介紹:

3.3分塊例子

四、互動過程

4.1推流

!

4.2拉流

五、實踐觀察

5.1rtmp推拉流環境搭建

參考視訊協議學習--HLS的環境部署

5.2rtmp推拉流抓包

5.2.1主要的推流包介紹

5.2.2主要的拉流包介紹

拉流的其他流程與推流類似:

六、總結展望

RTMP的粗略整理基本完畢,對自己來說的有了一定的認識,再細一點的研究需要真正做個demo可能會有深的理解。

七、參考資料

相關推薦

視訊協議學習--擅長RTMP

一、rtmp是什麼 從資料瞭解rtmp是一個實時訊息通訊協議,主要的變種功能如下: 1)RTMP工作在TCP之上,預設使用埠1935,這個是基本形態; 2)RTMPE在RTMP的基礎上增加了加密功能; 3)RTMPT封裝在HTTP請求之上,可穿透防火牆; 4)RTMPS類似RTMPT,增加了

windows上ffmpeg命令+nginx + rtmp實現

ffmpeg命令配置 1.下載ffmpeg官網地址:http://ffmpeg.org 找到window系統對應版本下載 2.配置path路徑 下載解壓完成,在環境變數中新增bin路徑: 我這裡配置 配置好以後就可以可以執行ffmpeg命令 剩

使用librtmp/

準備工作 #include "librtmp/rtmp_sys.h" #include "librtmp/log.h" #pragma comment(lib, "librtmp.lib") #

直播概念介紹

推流,指的是把採集階段封包好的內容傳輸到伺服器的過程。介紹一下目前有主流的推送協議,以及各自的優缺點。 RTMPRTMP是Real Time Messaging Protocol(實時訊息傳輸協議)的縮寫,是Adobe公司為Flash/AIR平臺和伺服器之間音、視訊及資料傳輸開發的實時訊息傳送協議。RTMP

FFmpeg總結(十三)用ffmpeg基於nginx實現直播功能,不用第三方SDK,自研

直播app實現流程 1.採集 2.濾鏡處理 3.編碼 4.推流 5.CDN分發 6.拉流 7.解碼 8.播放 9.聊天互動 影象格式: public static final int DEPTH16 = 11444022

視訊直播的實現

序言 最近在研究直播的彈幕,東西有點多,準備記錄一下免得自​​己忘了又要重新研究,也幫助有這方面需要的同學少走點彎路。關於直播的技術細節其實就是兩個方面一個是推流一個是拉流,而彈幕的實現核心在即時聊天,使用聊天室的就能實現,只是訊息的展示方式不同而已。在大多數的

ffmpeg-設定使用的協議型別(TCP/UDP)

如有錯誤,請指正,謝謝。 拉流(設定TCP/UDP) //設定引數 AVDictionary *format_opts = NULL; av_dict_set(&format_opts, "stimeout", std::to_string( 2* 1000000).c_

RTMP協議學習

前期準備 瞭解RTMP定義 RTMP是Real Time Messaging Protocol(實時訊息傳輸協議)的首字母縮寫。該協議基於TCP,是一個協議族,包括RTMP基本協議及RTMPT/RTMPS/RTMPE等多種變種。RTMP

利用ffmpeg進行視訊

使用FFMPEG命令列進行推拉流的操作 最新在公司實習,小組安排的技術需求第一階段,使用ffmpeg進行推拉流的處理以及自動化指令碼的編寫 在這裡記錄一下 ffmpeg工具去官網下載編譯即可(265格式需要自己寫相關程式碼並進行編譯) 首先是推流的指

使用 ffmpeg 進行網路->解封裝->解碼->處理原始資料(音訊、視訊)->編碼->編碼->

簡要說明: 1、可拉流:rtmp、rtsp、http 2、可推流: #include "stdafx.h" extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #

Linux服務器搭建SRS視頻

分享 oss size image linux服務器 hub srs 圖片 視頻 用法: 第一步:get SRS   git clone https://github.com/ossrs/srs    cd srs/trunk Linux服務器搭建SRS視頻推拉

Android 音視頻深入 十五 FFmpeg 實現基於Rtmp協議(附源碼下載)

音視頻 FFmpeg Rtmp 推流 源碼地址https://github.com/979451341/Rtmp 1.配置RTMP服務器 這個我不多說貼兩個博客分別是在mac和windows環境上的,大家跟著弄MAC搭建RTMP服務器https://www.jianshu.com/p/6fce

媒體壓力測試工具—

為方便流媒體服務端的壓力測試,向大家推薦一套流媒體的壓力測試工具(St-load),希望對從事流媒體測試或者對流媒體感興趣的同學有所幫助~ St-load 1.支援RTMP推流測試,一個程序支援500個併發。執行程式:./objs/sb_rtmp_publish 2.支援RTMP拉流測試

ffmpeg與Linux搭建伺服器

必要工具 Linux OS[4G記憶體,4核,10Mbps外網] yasm-1.2.0.tar.gz ffmpeg-3.0.2.tar.bz2 安裝步驟 1. 將ffmpeg-3.0.2.tar.bz2與yasm-1.2.0.tar.gz下載到目標伺服器上 2. 處理yasm

Linux系統配置nginx-rtmp(docker)OBS VLC

centos7配置nginx-rtmp (以下分享配置的前提是:用docker-ce版本不是docker-io) 這裡我直接使用 tiangolo/nginx-rtmp 來搭建 rtmp 伺服器。 sudo docker pull tiangolo/nginx-rtmp

EasyDarwin開源流媒體伺服器Golang版本:功能之實現方法

EasyDarwin開源流媒體伺服器(www.easydarwin.org),拉轉推是一個很有意義的功能,它可將一個獨立的RTSP資料來源“拉”到伺服器,再通過轉發協議轉發給多個客戶端,或者通過EasyDarwin的本地儲存功能進行儲存。國內大多攝像機都支援RTSP協議,通過拉轉推可將第三方

視訊 Linux安裝FFmpeg

  1 下載最新原始碼包並解壓 $ wget http://ffmpeg.org/releases/ffmpeg-3.1.3.tar.bz2 $ tar jxvf ffmpeg-3.1.3.tar.bz2 2安裝yasm $ yum install yasm 3安裝f

FFmpeg命令:幾種常見場景下的FFmpeg命令(攝像頭採集,桌面錄製、轉等等)

前提: 再者,推流你得有個流媒體服務,個人測試用小水管:rtmp://eguid.cc:1935/rtmp/test(小水管,請儘量錯開時間使用,另切記推流視訊位元速率不要太高,避免佔用太多頻寬)

ffmpeg送rtsp或者視訊檔案到rtsp伺服器

1.推送rtsp視訊流 ffmpeg -i rtsp://admin:[email protected]:554/h264/ch1/sub/av_stream -codec copy -f

一對一分析直播協議技術

近年來直播已成為網際網路行業的大熱話題,直播答題、遊戲直播、競賽直播等層出不窮,直播早已成為人們耳熟能詳的技術。事實上直播的興起不僅與新時代人們要求為自己代言的心理有關,同時也得益於頻寬的提速和CDN技術的發展。 伴隨著CDN技術的成熟,企業自己部署雲伺服器做直播也越來越簡單 。 本文作