簡體   English   中英

RTMP + AVC:多久發送一次AVCDecoderConfigurationRecord?

[英]RTMP + AVC: How often to send AVCDecoderConfigurationRecord?

我正在嘗試使用 C、libx264 和 librtmp 將 stream h.264 視頻通過 RTMP 轉播到轉播服務(特別是 twitch.tv)。

我的部分困惑來自於我正在流式傳輸到轉播服務,它大概不會錯過數據包,而且肯定已經看到了流的開始信息,並且可能還會為來來往往的新客戶重新打包我的輸入 stream . 所以我不確定我需要做什么來確保我作為一個來源“正確”地做,而不是廣播服務正在為我處理什么。

反正。 根據Adobe FLV 規范,h.264 stream 使用了三種類型的 AVCPacketType:

  • 類型 0:“AVC 序列頭”,包含 AVCDecoderConfigurationRecord
  • 類型 1:“AVC NALU”,包含一個或多個 NALU
  • 類型 2:“AVC 序列結束”,空主體

數據包類型 2 很明顯(在流末尾發送)。 但是我在將 h.264 的 PPS 和 SPS NALU 映射到 RTMP 容器時遇到了問題,並且規范對此並不完整。 這是我的問題:

  1. 我是否在 stream 的開頭發送一次 0 型數據包? 或者我是否多次發送它——也許在每個關鍵幀之前? (類型 0 數據包是否設置了“可搜索”標志?)如果只發送一次,客戶端如何處理加入中流?
  2. 我是否在類型 1 數據包中包括 SPS 和 PPS 類型以及 IDR 等? 或者它只包含在類型 0 中? 或兩者? (一些指南建議設置 x264 的 'repeat_headers' 參數,而其他指南則不建議。)同樣,客戶端如何處理加入中流?
  3. 比 RTMP 更多的是 h.264 問題,但是,SPS 或 PPS 可以在中途改變嗎? 如何發送新版本 - 新類型 0 標簽,包括類型 1 中的更改,或關閉 + 重新打開 stream?

我的理解基於我編寫的視頻系統(雖然我不是專家,但還是物有所值)

我是否僅在 stream 的開頭發送一次 0 型數據包? 或者我是否多次發送它——也許在每個關鍵幀之前? (類型 0 數據包是否設置了“可搜索”標志?)如果只發送一次,客戶端如何處理加入中流?

數據包類型 0 僅在 stream 的開頭發送一次。如果您將 RTMP 發送到播放客戶端,則需要在客戶端連接播放請求時將數據包類型 0 發送到客戶端,否則他們將無法解碼視頻幀。

我是否在類型 1 數據包中包括 SPS 和 PPS 類型以及 IDR 等? 或者它只包含在類型 0 中? 或兩者? (一些指南建議設置 x264 的 'repeat_headers' 參數,而其他指南則不建議。)同樣,客戶端如何處理加入中流?

SPS 和 PPS 不會以類型 1 發送,它們僅包含在類型 0 請求中(例如 AVCDecoderConfigurationRecord)。

比 RTMP 更多的是 h.264 問題,但是,SPS 或 PPS 可以在中途改變嗎? 如何發送新版本 - 新類型 0 標簽,包括類型 1 中的更改,或關閉 + 重新打開 stream?

我的理解是SPS不會在中途改變,大多數客戶端會忽略后來進來的SPS記錄。我認為PPS值不能改變但是你可以發送多組pps,每一幀都可以識別它們是哪個PPS使用(盡管我不是 100% 確定)。 我所做的研究似乎聲稱大多數視頻流使用單個 SPS 和單個 PPS(盡管我發現了一些例外,例如 WebRTC 發送新的 SPS 和 PPS 以及每個 IDR)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM