推流過程
1 握手過程
-
建立tcp連接飞蛹,發(fā)送 C0, C1 消息
C0:1字節(jié)纸俭,整數(shù)吧趣,請求使用的RTMP版本(基本就是版本3)
C1:1536字節(jié)和悦,時間戳(4字節(jié)) + 全零(4字節(jié)) + 隨機(jī)數(shù)(1528字節(jié))仁热,基本沒什么用榜揖,按要求生成就行
發(fā)送 C0, C1
-
- 等待 S0, S1 消息
服務(wù)端生成并返回 S0, S1 消息勾哩,規(guī)則與 C1, S1 相同
- 等待 S0, S1 消息
(備注:截圖中,全零4字節(jié)并沒有按要求設(shè)置举哟,因?yàn)檫@個無關(guān)緊要思劳,基本不會檢查這個要求)
-
發(fā)送 C2 消息
C2: 1536字節(jié),S1的時間戳(4字節(jié)) + 接收時間戳(4字節(jié)) + S1的隨機(jī)數(shù)
發(fā)送 C2
-
- 等待 S2 消息
生成規(guī)則與 C2 相同
收到 S2
(備注:截圖中妨猩,其實(shí)S0S1S2是同時收到的潜叛,服務(wù)端收到C1后,直接發(fā)送S0S1S2壶硅,這是最簡單直接的方式)
- 等待 S2 消息
- 握手完成
服務(wù)端也是類似的流程
(refs: https://rtmp.veriskope.com/docs/spec/#525handshake-diagram)
- 握手完成
2. 發(fā)送推流相關(guān)命令
- connect('live')
連接到 live 這個 app(此處假設(shè)推流地址為 rtmp://127.0.0.1/live/stream)威兜。
命令使用 MessagePacket 的方式發(fā)送,MessagePacket 會拆分為若干個 ChunkPacket 發(fā)送庐椒,當(dāng)接收方收到 MessageHeader 里面給出的 MessageLength 大小的數(shù)據(jù)后椒舵,就可以拼裝一個完整的 MessagePacket。
ChunkPacket
MessageHeader
- connect('live')
命令數(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)
(注:截圖中笔宿,transactionID:1 中,第一個字節(jié)(0x00)表示這個是 amf0 number棱诱,后面的字節(jié)(0x3ff0...)是浮點(diǎn)數(shù)1的內(nèi)存數(shù)據(jù))
- createStream()
創(chuàng)建流
- createStream()
- publish('stream')
發(fā)布 stream 流
- publish('stream')
- 命令交互完成泼橘,準(zhǔn)備發(fā)送數(shù)據(jù)
(refs: https://rtmp.veriskope.com/docs/spec/#731-publish-recorded-video)
- 命令交互完成泼橘,準(zhǔn)備發(fā)送數(shù)據(jù)
3. 發(fā)送數(shù)據(jù)
數(shù)據(jù)也是跟命令一樣使用 MessagePacket ChunkPacket 的方式發(fā)送。MessageHeader 里設(shè)置 MessageTypeID 為 9 則表示這個是視頻數(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 )
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