近期在 RTP 專案中遭遇棘手問題,耗時近一週才定位根因:對 RTP 協定中 Payload Type(負載類型)與 Timestamp(時間戳)的語義理解不夠透徹。雖有 jrtplib、oRTP 等成熟函式庫加持,但若不掌握底層原理,問題一發生便無從下手。本文將這些核心概念系統化整理,助你避開同樣陷阱。
RTP 標頭第 10~16 位元為 PT(Payload Type)欄位,定義封包承載資料的媒體編碼格式(如 G.729、H.264、MPEG-4)。接收端依此欄位選擇對應解碼器,是媒體協商的關鍵。
oRTP (v0.9.1) 內建主流媒體類型常數,涵蓋 PCMU、G.729、H.263、MPEG-4 等。早期版本缺 H.264 定義,新版已補齊。jrtplib 亦有對應定義。關鍵操作:必須根據實際媒體流呼叫庫提供的 set_payload_type() 等介面正確設定。筆者曾因疏忽使用預設 PCMU 音訊類型傳送 H.264 視訊,導致傳輸異常難以排查。
1 / 採樣頻率。例:音訊 8kHz → 單位 1/8000 秒。RFC 3550 規定:時間戳反映 RTP 封包中第一個位元組的採樣時刻;會話啟動時初值隨機;靜默期間時間戳仍須遞增。接收端用於消除抖動、音視同步。
即每發送一幀視訊,時間戳遞增 3600。此值直接決定網路發送節奏:增量越小發送越快,需與採集速率匹配以均衡頻寬。
磨刀不誤砍柴工,掌握協定本質才能高效解決疑難雜症。