UDP下嘅實時音視頻傳輸機制

前言

經歷咗一兩年係項目當中嘅實時音視頻實踐, 覺得要實現好嘅實時音視頻傳輸實屬不易. 以下呢套UDP下嘅實現流程, 係血嘅經驗, 每一點都是來之不易.

全局要點: 視頻可跳, 但聲音不斷.

發送方

  1. 開始時, 編碼I幀, 發送
  2. 接著, 發P幀 ( 聲音與視頻編碼是不同的, 每次真實發送幀前, 讀取錄音緩沖區, 並打包 ), 發N個P幀後, 跳到 a
  3. 如果在發P幀過程中, 接收到對方發來的 "重發I 幀" 請求, 馬上放棄目前所編碼的幀(視頻幀,不是聲音幀), 跳轉到 a

接收方

  1. 建立幀列表, 至少存儲3幀以上才開始播放, 使用順序插入法, 尋找相應幀序號的位置, 並插入.
  2. 播放開始時, 不停從幀列表中取得一幀(由於此時幀列表是順序的,故此取列表頭的那一幀即可), 如果是P幀時則放棄, 直到找到I幀才開始真正播放. 聲音幀不需要等I幀, 只要按著順序播放即可.
  3. 播放過程中, 不停從幀列表中取得一幀進行播放( 聲音播放與視頻播放線程需要分開!!切記! )
  4. 當視頻播放線程發現聲音播放的幀號大於正要播放的視頻2幀以上時, 馬上放棄當前播放的視頻, 並請求對方 "重發I幀", 並一直讀取到幀緩沖列表中大於等於音頻幀號的視頻 "I" 幀為止, 再播放 ( 此處是解決音視頻不同步的情況, 即視頻慢於音頻並隨時間累積 )
  5. 如果在 c 當中, 發現掉幀了( 要播放的幀號不等於上一次播放的幀號 +1 ), 請求對方 "重發I幀", 並等待下一個 "I幀" (針對的是視頻幀, 音頻幀只要是大於上一次播放的幀號即可以播放 )

注意

上面缺了任何一點, 都會導致播放出現問題!

Comments !