NALU RTP PS流
三者總體關系?
NALU在RTP中的應用:視頻流的RTP傳輸通常將NALU作為基本的單元進行傳輸。每個RTP包攜帶一個或多個NALU,這些NALU包含了視頻編碼數據。RTP協議通過其頭部信息(如時間戳、序列號等)幫助接收端重新排列和解碼這些NALU
PS流和NALU的轉化:PS流本質上是一個容器,它可以封裝多個NALU。在將PS流通過網絡傳輸時,通常會將其分解成一個個NALU,然后通過RTP傳輸。這意味著PS流在網絡傳輸中的表現通常是通過RTP承載NALU來實現的(注意,一般在GB28181平臺上,都是先將Nalu封裝成PS流后,然后再通過RTP包進行發送)
RTP封裝PS流:盡管PS流通常是MPEG-2的容器格式,但它也可以用來封裝視頻數據和音頻數據。當使用RTP進行流傳輸時,PS流通常會被切分成RTP包進行發送。RTP負責將數據流化并以網絡友好的方式進行傳輸,而PS流則可能作為RTP數據的內容進行封裝
NALU
可以吧Nalu想象成視頻編碼數據中信封,編碼器就是將編碼后的視頻數據封裝成一個一個的Nalu,然后通過網絡進行傳輸
NALU是視頻編碼(特別是H.264/H.265)中網絡抽象層的單位。NALU是視頻編碼后生成的數據塊,用于將編碼數據從編碼器傳輸到網絡層(如RTP、RTSP等)。每個NALU包含一個完整的編碼數據單元,可以獨立解碼(例如一個圖像幀的部分)
主要功能:NALU中包含了視頻編碼的具體信息,比如圖像幀的宏塊、序列參數集、片段參數集等。NALU通常是H.264或H.265編碼數據的基本傳輸單位
網絡抽象層(NAL)作用分析
視頻編碼標準(也就類似H264 265)一般分為兩個主要層次
- 視頻編碼層(VCL):VCL主要就是負責視頻內容的壓縮編碼,例如預測、變換、量化、熵編碼等核心編碼算法都發生在這個層面。 VCL 產生的輸出就是?編碼后的視頻數據,也就是我們常說的?視頻碼流
- 網絡抽象層(NAL):負責?將 VCL 層產生的編碼數據適配到各種不同的網絡傳輸環境。 不同的網絡傳輸協議(如 RTP, RTSP, MPEG-2 TS, HTTP 等)對數據的格式和傳輸方式有不同的要求。 NAL 的作用就是將 VCL 產生的原始碼流?封裝成符合特定網絡協議要求的格式,以便在各種網絡中可靠地傳輸
Nalu的結構
簡單來說NALU就是由兩個部分組成,分別是NALU頭部信息以及NALU負載。頭部信息主要包含了NALU類型等新,負載就是實際的編碼數據
NALU主要功能以及編碼數據類型
NALU 的核心功能就是?封裝和組織編碼后的視頻數據,使其可以作為網絡傳輸的基本單元
- 視頻編碼層NALU,該類NALU包含實際的視頻編碼內容,是構成視頻流的主體部分
- 編碼片段:常見的NALU類型,其中包含了圖像幀的編碼數。在真實的傳輸中,一個圖像幀可能會被分割成多個silece nalu進行傳輸
- IDR圖像:特殊的圖像幀, 解碼器可以獨立解碼IDR圖像,不需要考慮之前的幀。IDR圖像一般都是用于視頻流的隨機訪問和錯誤恢復
- 非視頻編碼層的NALU,該NALU包含了解碼器正常工作所需要的輔助信息,但是沒有實際的視頻幀數據
-
序列參數集 (SPS - Sequence Parameter Set):?包含了?序列級別?的解碼參數,例如?視頻的 profile、level、分辨率、幀率?等信息。 SPS 對于解碼整個視頻序列至關重要,通常在視頻流的開始處發送一次,或者在視頻參數發生變化時更新。
-
圖像參數集 (PPS - Picture Parameter Set):?包含了?圖像級別?的解碼參數,例如?熵編碼模式、slice 分割方式?等信息。 PPS 針對每個圖像幀或一組圖像幀有效,可以頻繁更新。
-
補充增強信息 (SEI - Supplemental Enhancement Information):?包含了?與解碼過程本身無關的輔助信息,例如?定時信息、顯示信息、用戶自定義數據?等。 SEI 信息對于解碼器不是必需的,但可以用于增強視頻播放體驗或實現特定功能。
-
RTP
RTP類似于一條高速公路,專門用于快速、準時運送實時性極高的數據
RTP是一種用于實時數據傳輸的協議,尤其適用于音視頻流的傳輸。它設計用于在網絡中傳輸實時數據(如音頻、視頻),提供時間戳、序列號和控制信息,幫助接收方重新排序丟失的數據包
主要功能
在視頻流傳輸中,RTP用于將視頻數據(如NALU)封裝并傳輸到接收方。RTP保證了數據的實時性和順序,可以處理丟包、延遲等問題。每個RTP包通常包含一個或多個NALU,RTP包頭提供時間戳和序列號等信息,幫助接收方恢復視頻數據的時序
RTP協議特點
RTP 的設計目標是?實時性優先,而不是完全可靠性。 這意味著 RTP?盡力保證數據的及時送達和播放的流暢性,即使在網絡條件不佳的情況下,可能會犧牲一些數據的完整性(例如,允許少量數據包丟失)
對于實時音視頻應用(例如視頻會議、在線直播),延遲 (Latency)?是一個非常關鍵的指標。 如果數據傳輸延遲過高,會導致音視頻播放卡頓、畫面和聲音不同步等問題,嚴重影響用戶體驗。 RTP 的設計就充分考慮了實時性的需求,力求?最小化延遲
RTP的關鍵功能
-
時間戳 (Timestamping):?RTP 包頭中包含?時間戳字段。 時間戳記錄了?RTP 數據包中第一個字節的采樣時刻。 這個時間戳對于接收端?恢復音視頻數據的時序?至關重要,主要用于:
-
同步播放:?接收端可以使用時間戳來?同步音頻和視頻流,確保音視頻同步播放。
-
抖動處理:?網絡傳輸中,數據包到達接收端的時間間隔可能會不均勻,產生抖動。 接收端可以使用時間戳來?平滑抖動,保證播放的流暢性。
-
-
序列號 (Sequence Numbering):?RTP 包頭中包含?序列號字段。 序列號用于?標識 RTP 數據包的發送順序。 接收端可以使用序列號來:
-
數據包重排序:?在 IP 網絡中,數據包可能不按發送順序到達接收端。 序列號可以幫助接收端?將亂序的數據包重新排序,恢復原始的數據順序。
-
檢測數據包丟失:?通過檢查序列號的連續性,接收端可以?檢測到數據包的丟失,并采取相應的措施(例如,請求重傳,或者在實時性要求較高的情況下,直接忽略丟失的數據包)。
-
-
控制信息 (Control Information) - RTCP:?RTP 協議通常與?RTCP(RTP 控制協議 - RTP Control Protocol)?一起使用。 RTCP 協議與 RTP 協議?并行工作,但不傳輸實際的音視頻數據,而是?傳輸控制信息,用于:
-
服務質量 (QoS) 反饋:?RTCP 允許接收端向發送端?反饋網絡狀況和接收質量,例如?丟包率、延遲、抖動?等信息。 發送端可以根據 RTCP 反饋信息?動態調整編碼參數或傳輸策略,以適應網絡變化,優化服務質量。
-
會話管理:?RTCP 可以用于?會話參與者的身份標識和管理,例如報告參與者信息、進行會話控制等。
-
RTP在視頻流中的作用分析
NALU 封裝:?RTP 通常用于?封裝視頻編碼后的 NALU (網絡抽象層單元)。 每個 RTP 包的?負載 (Payload)?部分通常包含一個或多個 NALU。 這樣,NALU 就被封裝在 RTP 包中,可以通過網絡進行傳輸
實時性和順序保證 (盡力而為):?RTP 協議?盡力保證數據的實時性和順序,但它?不是一個完全可靠的協議。 RTP 協議本身?不提供重傳機制?來保證數據包的可靠送達。 RTP 的重點在于?及時傳輸數據,即使在網絡擁塞或不穩定的情況下,也盡量保證視頻流的?連續性和流暢性,而不是追求 100% 的數據可靠性。 在網絡條件較差時,可能會出現?丟包?或?延遲?等問題,但 RTP 的時間戳和序列號機制可以幫助接收端?最大限度地恢復視頻數據的時序和完整性
RTP包頭信息,?RTP 包頭中包含的關鍵信息(如?時間戳?和?序列號)對于接收端?恢復視頻數據的時序?至關重要。 接收端可以利用這些信息進行同步播放、抖動緩沖等
PS流
PS流(Program Stream)是MPEG-2視頻標準的一部分,通常用于封裝和傳輸視頻、音頻、字幕等多媒體數據。它是一種容器格式,用于將多個媒體流(如視頻流和音頻流)組合成一個程序(program),以便于存儲和傳輸。主要目的是將?視頻、音頻、字幕?等多種不同的媒體流?“打包”?成一個單一的?“節目” (Program),以便于?存儲和傳輸。
主要功能
多媒體流復用,其可以就愛那個多個獨立的媒體流(例如視頻流、音頻流、字符流以及其他輔助數據)組合成一個單一的、連續的數據流。該過程就類似于將不同的解碼片段組合成一個完整節目
PS流在網絡傳輸中會轉換為RTP流(重點)
雖然 PS 流非常適合文件存儲和物理介質傳輸,但它?不太適合直接用于網絡傳輸,特別是?互聯網等 IP 網絡環境?中的?實時流媒體傳輸
-
面向文件,非面向數據包:?PS 流是一種?連續的字節流格式,它沒有被設計成易于分割成?網絡數據包?的結構。 將其直接通過 IP 網絡傳輸,需要進行額外的分包和重組,效率較低。
-
缺乏實時傳輸特性:?PS 流?本身不具備 RTP 協議那樣的時間戳、序列號和控制信息等實時傳輸特性。 在網絡丟包或抖動的情況下,PS 流的抗丟包能力和時序恢復能力較弱,難以保證實時播放的流暢性。
PS流封裝RTP包(重點)
在?網絡流媒體應用?中,為了更好地適應 IP 網絡的特點,并實現?低延遲、高效率、抗丟包?的實時傳輸,PS 流通常會被轉換為 RTP 流
-
解封裝 PS 流:?首先,將 PS 流解封裝,提取出其中的?視頻流 (例如 MPEG-2 視頻碼流)?和?音頻流?等基本媒體流。
-
NALU 封裝 (對于 H.264/H.265 視頻):?如果視頻流是 H.264 或 H.265 編碼的,則將其?進一步解析為 NALU (網絡抽象層單元)。 NALU 是更小的、更適合網絡傳輸的編碼數據單元。
-
RTP 封裝:?將?NALU (或原始視頻/音頻數據)?封裝到?RTP 包?中。 每個 RTP 包頭會添加?時間戳、序列號?等 RTP 特有的信息。
-
通過 UDP/IP 網絡傳輸:?將 RTP 包通過?UDP (用戶數據報協議)?或?IP (互聯網協議)?網絡進行傳輸。 UDP 協議具有較低的延遲和較高的效率,更適合實時流媒體應用
I幀、P幀、B幀
基本概念
- I幀(關鍵幀):獨立的幀,可以單獨解碼,無需參考其他幀。
- P幀(預測幀):依賴之前的I幀或P幀,通過預測編碼減少數據量。
- B幀(雙向預測幀):通過前后幀的雙向預測來壓縮數據,通常比P幀更加高效
I幀
I幀是視頻編碼中的關鍵幀,它是完全自包含的幀,可以獨立解碼,無需依賴其他幀。I幀是視頻編碼中的基本單元,通常作為一個完整的圖像進行存儲(參考電影24幀中關鍵幀理解)
主要特點總結
- I幀通過對每個像素點進行編碼來表示圖像,壓縮方式較為簡單,通常使用離散余弦變換(DCT)
- 因為I幀不依賴其他幀,它能夠恢復圖像的完整信息,所以解碼時不需要任何額外的數據
- I幀通常占用較大的文件大小,因為它包含了完整的圖像信息,而不像P幀和B幀那樣依賴其他幀的數據來減少冗余
主要用途
- I幀通常用于視頻流的切換點、視頻文件的開始或其他需要快速恢復的地方。
- 在視頻播放過程中,I幀可以作為參考幀來幫助解碼后續的P幀和B幀。
P幀
P幀是通過參考之前的I幀或P幀進行編碼的,它包含了與前面幀的差異信息。P幀只存儲與前一幀的變化部分(例如運動向量),因此能大大減少數據量
主要特點
- P幀依賴于前面的I幀或P幀。它通過運動補償和差異編碼的方法,只記錄與參考幀的不同之處。
- P幀的編碼方式相較于I幀要高效一些,但比B幀要少些。它通常較小,并且需要通過前面的幀來解碼。
- 通過對比當前幀和參考幀的不同,P幀減少了冗余信息,壓縮效率較高。
主要用途
- P幀用于減少視頻中的冗余信息,通過參考前面的幀來壓縮數據。視頻流中I幀和P幀的交替使用,使得視頻編碼更加高效。
- 在視頻流播放過程中,P幀通常依賴于前面的I幀或P幀來恢復圖像內容。
B幀
B幀是通過參考前后兩幀(I幀或P幀)來預測當前幀的信息。B幀通過雙向運動估計來實現比P幀更高效的壓縮,能夠進一步減少數據量
主要特點
- B幀與P幀的不同之處在于,它不僅依賴于前面一幀的數據,還可以參考后續的幀。它使用雙向預測來求解當前幀的內容,因此能夠達到更高的壓縮率。
- 因為B幀需要同時依賴前后的幀,所以解碼時的復雜度會更高,且B幀不能單獨解碼。
- B幀的數據量最小,因為它依賴于前后兩幀的運動估計。
主要用途
- B幀是視頻編碼中壓縮效率最高的幀類型,適用于大多數的非實時視頻流和大文件的編碼。
- 因為B幀需要參考前后幀,它通常被用于視頻編碼的中間部分,能夠有效地提高編碼效率。
編碼器與解碼器
基本概念
- 編碼器(Encoder):負責將原始音視頻數據轉換為壓縮格式(例如H.264、HEVC等)。
- 解碼器(Decoder):負責將壓縮后的數據還原為原始音視頻流。
編碼器
編碼器的主要作用是將原始的音視頻信號(如未壓縮的音頻或視頻)轉換成壓縮的格式(如H.264, HEVC, AAC等)。這個過程叫做“編碼”或“壓縮”,它減少了數據的大小,從而便于存儲和傳輸
工作原理總結
-
幀分割:首先,視頻或音頻數據會被分割成單獨的幀。視頻通常以圖像幀為單位進行分割,而音頻則通常以時間為單位進行分割(例如采樣率為44.1kHz的音頻會以每秒44100個采樣點進行處理)。
-
變換和量化:對每一幀進行數學變換(例如DCT—離散余弦變換,或離散傅里葉變換等),將圖像或音頻信號轉換為頻域數據。然后,進行量化操作,將信號值限制在一定范圍內,從而喪失一些精度,減少數據量。
-
預測和差分:對于視頻編碼,編碼器會基于當前幀與前一幀的差異(運動估計)來進行編碼。例如,視頻編碼中的P幀和B幀通過預測前后幀的差異來達到更高的壓縮比。
-
編碼:通過特定的算法對信號進行編碼。例如,H.264使用的CABAC(Context-based Adaptive Binary Arithmetic Coding)或者CAVLC(Context Adaptive Variable Length Coding)進行壓縮。音頻編碼則使用如AAC中的MDCT(Modified Discrete Cosine Transform)等變換和編碼方法。
-
輸出壓縮數據:最終編碼器將經過壓縮處理的音視頻數據輸出為某種格式的壓縮碼流,常見的編碼格式有H.264、HEVC(H.265)、VP9、AAC、MP3等。
解碼器
解碼器的作用是將壓縮的音視頻數據轉換回原始的音視頻信號。它是編碼器的反向操作,目標是恢復出盡可能接近原始數據的內容。解碼器通常用于播放壓縮視頻文件、音頻文件或流媒體內容
工作原理總結
-
接收壓縮數據:解碼器接收來自存儲或網絡傳輸的壓縮數據流(例如,H.264、HEVC、AAC等格式的文件或流)。
-
解碼:解碼器首先對壓縮的數據進行解碼操作,這個過程包括:
- 運動補償:在視頻解碼中,解碼器會根據編碼過程中計算出的運動矢量和參考幀恢復視頻幀的內容。
- 逆變換和反量化:解碼器將接收到的頻域數據通過逆變換(如逆DCT)轉回時域數據,并通過反量化過程恢復丟失的一部分精度。
- 預測還原:對于P幀和B幀,解碼器根據前后幀的參考信息恢復圖像數據。
-
圖像或音頻輸出:經過解碼的數據將轉換為可播放的音頻信號或視頻幀。例如,視頻信號可以恢復為幀序列,音頻信號則恢復為一系列聲音波形。
-
顯示或播放:對于視頻解碼,解碼器將輸出的幀傳遞給顯示設備進行呈現;對于音頻解碼,輸出的音頻數據傳遞給音響設備進行播放。
碼流
經過壓縮和編碼的音視頻數據流。它包含了編碼后的視頻信息和音頻信息。
視頻碼流
視頻碼流通常是由一系列編碼后的幀(I幀、P幀、B幀)組成,它們按照一定的順序(例如,GOP——圖像組)排列。視頻碼流的結構包括以下幾個主要部分
-
幀數據:包括壓縮后的視頻幀數據(例如H.264編碼中的NAL單元),表示視頻每一幀的內容。每一幀可以是I幀(關鍵幀)、P幀(預測幀)或B幀(雙向預測幀)。
-
NAL單元(Network Abstraction Layer Units):在H.264/HEVC等編碼標準中,視頻碼流被分割成多個NAL單元。每個NAL單元包含一個或多個編碼后的視頻數據,負責存儲視頻幀的壓縮信息。NAL單元是視頻碼流的基本組成單元。
-
頭部信息:包括一些控制信息,如編碼參數、分辨率、幀率、參考幀信息等,這些用于指導解碼器如何正確解碼視頻流。
-
時間戳:碼流中通常會有時間戳,用來指示視頻幀的展示時間和播放順序。
-
封裝格式:視頻碼流通常會被封裝成容器格式,如 MP4、MKV、AVI 等,這些容器格式將視頻流、音頻流、字幕流等多個媒體流組合在一起,便于存儲和傳輸。
音頻碼流
音頻碼流則是經過音頻編碼(如 AAC、MP3、Opus 等)處理后產生的二進制數據流。它的結構一般包括
-
幀數據:音頻碼流包含一系列音頻幀(例如,AAC中的音頻幀)。每一幀可能包含一段音頻的壓縮信息。
-
頭部信息:包括音頻格式、采樣率、通道數、比特率等音頻的基本屬性。
-
時間戳:音頻碼流同樣會包含時間戳,以便音頻能夠與視頻同步播放。
-
封裝格式:音頻流也常常與其他多媒體數據一起封裝在容器文件中,如 MP4、MKV、FLV 等。
視頻碼流主要類型
- H.264/AVC(Advanced Video Coding):一種廣泛使用的視頻編碼標準,壓縮效率較高,廣泛應用于網絡視頻流、藍光光盤、高清電視等。
- HEVC/H.265(High Efficiency Video Coding):H.264的繼任者,提供比H.264更高的壓縮效率,廣泛用于4K視頻壓縮。
- VP9:Google推出的視頻編碼格式,廣泛應用于YouTube等流媒體平臺。
- AV1:新的開源視頻編碼標準,提供比HEVC和VP9更高的壓縮效率,主要用于高質量視頻流和Web視頻播放。
音頻碼流主要類型
- AAC(Advanced Audio Codec):一種高效的音頻編碼格式,廣泛應用于流媒體和廣播。
- MP3(MPEG Audio Layer III):早期廣泛使用的音頻編碼格式,壓縮效率較低,但依然廣泛存在。
- Opus:一種低延遲音頻編解碼器,特別適用于實時通信(如VoIP)和音頻流。
SEI
概念
SEI是視頻流中附加的信息,通常用于增強視頻質量、實現更高效的編碼或者提供額外的傳輸信息。它通常不會影響解碼,但對于解碼后的顯示或者處理有幫助。
視頻編碼中的作用
- 顯示與呈現:包括視頻播放中的顯示特性、顏色空間信息、色度調整等,用于增強視頻的顯示效果。
- 后期處理:提供用于后期視頻處理的參數,例如去噪、銳化、增強對比度等。
- 傳輸優化:在網絡傳輸過程中,通過SEI提供一些動態調整參數或網絡條件信息,從而優化傳輸質量。
- 編碼優化:在編碼階段,SEI可以傳輸一些額外的輔助信息,幫助解碼器或顯示設備更好地適應編碼特性,改善視頻質量。
與Nalu的關系
在H.264和HEVC等編碼標準中,SEI通常以**NALU(Network Abstraction Layer Units)**的形式存在。NALU是視頻碼流的基本單位,用來包裝各種編碼信息,而SEI則是被包裝在某些類型的NALU中作為附加信息進行傳輸
注意,SEI在國標平臺上傳輸,也是需要先封裝成PS流,然后再打成RTP包進行發送