【速成】RTMP - 協(xié)議詳解 推流過程

推流過程

1 握手過程
    1. 建立tcp連接,發(fā)送 C0, C1 消息
      C0:1字節(jié),整數(shù),請(qǐng)求使用的RTMP版本(基本就是版本3)
      C1:1536字節(jié),時(shí)間戳(4字節(jié)) + 全零(4字節(jié)) + 隨機(jī)數(shù)(1528字節(jié)),基本沒什么用,按要求生成就行


      發(fā)送 C0, C1
    1. 等待 S0, S1 消息
      服務(wù)端生成并返回 S0, S1 消息,規(guī)則與 C1, S1 相同

收到 S0, S1

(備注:截圖中,全零4字節(jié)并沒有按要求設(shè)置,因?yàn)檫@個(gè)無關(guān)緊要,基本不會(huì)檢查這個(gè)要求)

    1. 發(fā)送 C2 消息
      C2: 1536字節(jié),S1的時(shí)間戳(4字節(jié)) + 接收時(shí)間戳(4字節(jié)) + S1的隨機(jī)數(shù)


      發(fā)送 C2
    1. 等待 S2 消息
      生成規(guī)則與 C2 相同
      收到 S2

      (備注:截圖中,其實(shí)S0S1S2是同時(shí)收到的,服務(wù)端收到C1后,直接發(fā)送S0S1S2,這是最簡單直接的方式)
    1. 握手完成
      服務(wù)端也是類似的流程
      (refs: https://rtmp.veriskope.com/docs/spec/#525handshake-diagram)
2. 發(fā)送推流相關(guān)命令
    1. connect('live')
      連接到 live 這個(gè) app(此處假設(shè)推流地址為 rtmp://127.0.0.1/live/stream)。
      命令使用 MessagePacket 的方式發(fā)送,MessagePacket 會(huì)拆分為若干個(gè) ChunkPacket 發(fā)送,當(dāng)接收方收到 MessageHeader 里面給出的 MessageLength 大小的數(shù)據(jù)后,就可以拼裝一個(gè)完整的 MessagePacket。
      ChunkPacket

      MessageHeader

命令數(shù)據(jù)格式:
BasicHeader(1/2/3B) + MessageHeader(0/3/7/11B) + Ts(0/4B) +
AMF0/AMF3
BasicHeader:
Fmt(2bits) + ChunkStreamID(6bits)
Fmt決定 MessageHeader 使用 0/3/7/11 中的一種格式
Fmt: 0 使用11字節(jié)格式
Fmt: 1 使用7字節(jié)格式,以此類推
AMF命令格式:
命令名稱(String) + 事務(wù)ID(Number) + 參數(shù)(Object)
AMF0格式:數(shù)據(jù)類型(1B) + 數(shù)據(jù)
(amf0 refs: https://rtmp.veriskope.com/pdf/amf0-file-format-specification.pdf)
(amf3 refs: https://rtmp.veriskope.com/pdf/amf3-file-format-spec.pdf)

connect command packet

(注:截圖中,transactionID:1 中,第一個(gè)字節(jié)(0x00)表示這個(gè)是 amf0 number,后面的字節(jié)(0x3ff0...)是浮點(diǎn)數(shù)1的內(nèi)存數(shù)據(jù))

3. 發(fā)送數(shù)據(jù)

數(shù)據(jù)也是跟命令一樣使用 MessagePacket ChunkPacket 的方式發(fā)送。MessageHeader 里設(shè)置 MessageTypeID 為 9 則表示這個(gè)是視頻數(shù)據(jù)。
其他 MessageTypeID :

0x01 = Set Packet Size Message.
0x02 = Abort.
0x03 = Acknowledge.
0x04 = Control Message.
0x05 = Server Bandwidth
0x06 = Client Bandwidth.
0x07 = Virtual Control.
0x08 = Audio Packet.
0x09 = Video Packet.
0x0F = Data Extended.
0x10 = Container Extended.
0x11 = Command Extended (An AMF3 type command).
0x12 = Data (Invoke (onMetaData info is sent as such)).
0x13 = Container.
0x14 = Command (An AMF0 type command).
0x15 = UDP
0x16 = Aggregate
0x17 = Present

數(shù)據(jù)格式:
BasicHeader + MessageHeader + VIDEODATA/AUDIODATA
在RTMP里面,音視頻數(shù)據(jù)使用 flv10.1里面定義的VIDEODATA/AUDIODATA格式
VIDEODATA格式:
FrameType(4bits) + CodecID(4bits) + AVCPacketType(1B) + CTS(3B) + Data(seq/AVCNaluData)

FrameType: key(1), inter(2) 等
CodecID: avc(7) 等
AVCPacketType: seq header(0), nalu(1), end(2)

(refs: https://rtmp.veriskope.com/pdf/video_file_format_spec_v10_1.pdf - page78 )
AUDIODATA格式:
SoundFormat(4bits) + SoundRate(2bits) + SoundSize(1bit) + SoundType(1bit) + AACPacketType(1B) + Data(seq/AACData)

SoundFormat: MP3(2), AAC(10), SPEEX(11) 等
SoundRate: 5.5kHz(0), 11kHz(1), 22kHz(2), 44kHz(3)
SoundSize: 8位(0), 16位(1)
SoundType: MONO(0), STEREO(1)
AACPacketType: seq header(0), raw(1)

(refs: https://rtmp.veriskope.com/pdf/video_file_format_spec_v10_1.pdf - page76 )

Video Data Packet

4. 停止推流

斷開 tcp 連接,服務(wù)端判定為停止推流

播放過程與推流類似

相關(guān)資料

https://blog.csdn.net/u013637931/article/details/108318996 - RTMP協(xié)議文檔中文
https://rtmp.veriskope.com/docs/spec/ - RTMP協(xié)議文檔英文
https://community.adobe.com/t5/media-server-discussions/fms-is-there-some-secret-reference-i-don-t-know-about/m-p/4273450 - 關(guān)于 releaseStream/FCPublish
https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol - wikipedia rtmp protocol

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容