導航:首頁 > 源碼編譯 > 軍用音視頻編解碼演算法

軍用音視頻編解碼演算法

發布時間:2024-01-31 22:51:43

⑴ 音視頻壓縮:H264碼流層次結構和NALU詳解

前言:
為什麼需要編碼呢?比如當前屏幕是1280*720.一秒24張圖片.那麼我們一秒的視頻數據是
1280*720(位像素)*24(張) / 8(1位元組8位)(結果:B) / 1024(結果:KB) / 1024 (結果:MB) = 2.64MB
一秒的數據有2.64MB數據量。1分鍾就會有100多MB。這對用戶來說真心是災難。所以現在我們需要一種壓縮方式減小數據的大小.在更低 比特率(bps)的情況下依然提供清晰的視頻。
H264: H264/AVC是廣泛採用的一種編碼方式。我們這邊會帶大家了解。從大到小排序依次是 序列,圖像,NALU,片,宏塊,亞宏塊,塊,像素。

問題背景:

前面在講封裝格式過程中,都有一個章節講解如何將H.264的NALU單元如何打包到TS、FLV、RTP中,解裝剛好相反,怎麼從這些封裝格式裡面解析出一個個NALU單元。NALU即是編碼器的輸出數據又是解碼器的輸入數據,所以在封裝和傳輸時,我們一般處理對象就是NALU,至於NALU內部到底是什麼則很少關心。甚至我們在編解碼時,我們只需要初始化好x264編碼庫,然後輸入YUV數據,它就會給你經過一系列壓縮演算法後輸出NALU,或者將NALU輸入到x264解碼庫就會輸出YUV數據。

這篇文章就初步帶你看下NALU能傳輸那些數據,NALU的類型和結構以及H264碼流的層次,最後通過分析工具分析下裸碼流記性驗證,你可以選擇感興趣章節閱讀。

NALU結構:

H.264的基本流(elementary stream),也叫裸流(沒有加格式封裝),就是一系列NALU的集合,如下圖所示:

用Notepad十六進制形式打開,以annexb格式存儲的h264裸流文件內容:

NALU結構分為兩層,包含了視頻編碼層(VCL)和網路適配層(NAL):

視頻編碼層(VCL即Video Coding Layer) :負責高效的視頻內容表示,這是核心演算法引擎,其中對宏塊、片的處理都包含在這個層級上,它輸出的數據是SODB;

網路適配層(NAL即Network Abstraction Layer) :以網路所要求的恰當方式對數據進行打包和發送,比較簡單,先報VCL吐出來的數據SODB進行位元組對齊,形成RBSP,最後再RBSP數據前面加上NAL頭則組成一個NALU單元。

分層目的:

這樣做的目的:VCL只負責視頻的信號處理,包含壓縮,量化等處理,NAL解決編碼後數據的網路傳輸,這樣可以將VCL和NAL的處理放到不同平台來處理,可以減少因為網路環境不同對VCL的比特流進行重構和重編碼;

NLAU結構:

其實NALU的承載數據真實並不是RBSP(Raw Byte Sequence Playload)而是EBSP即(Extent Byte Sequence Payload),EBSP和RBSP的區別就是在 RBSP裡面加入防偽起始碼位元組(0x03),因為H.264規范規定,編碼器吐出來的數據需要在每個NALU添加起始碼:0x00 00 01或者0x00 00 00 01,用來指示一個NALU的起始和終止位置,那麼RBSP數據內部是有可能含有這種位元組序列的,為了防止解析錯誤,所以在RBSP數據流裡面碰到0x 00 00 00 01的0x01前面就會加上0x03,解碼時將NALU的EBSP中的0x03去掉成為RBSP,稱為脫殼操作。

原始位元組序列負載 RBSP即Raw Byte Sequence Playload,因為VCL輸出的 原始數據比特流 SODB即String Of Data Bits,其長度不一定是8bit的整數倍,為了湊成整數個位元組,往往需要對SODB最後一個位元組進行填充形成RBSP,所以從SODB到RBSP的示意圖如下:

填充方式就是對VCL的輸出數據進行8bit進行切分,最後一個不滿8bit的位元組第一bit位置1,然後後面預設的bit置0即可
具體填充語法見下文:

原來文檔中的解釋:

主要的意思我的理解如下:

其中H.264規范規定,編碼器吐出來的數據需要在每個NALU添加起始碼:0x00 00 01或者0x00 00 00 01,用來指示一個NALU的起始和終止位置。

所以H.264編碼器輸出的碼流中每個幀開頭3-4位元組的start code起始碼為0x00 00 01或者0x00 00 00 01。

上面我們分析了NALU的結構以及每層輸出數據的處理方法,但是對於NALU的RBSP數據二進製表示的什麼含義並不清楚,下面分析下NALU的類型。

1. NALU Header

頭信息協議如上圖。

舉例說明:

這其中NALU的RBSP除了能承載真實的視頻壓縮數據,還能傳輸編碼器的配置信息,其中能傳輸視頻壓縮數據的為slice。

那麼如果NLAU傳輸視頻壓縮數據時,編碼器沒有開啟DP(數據分割)機制,則一個片就是一個NALU,一個 NALU 也就是一個片。否則,一個片由三個 NALU 組成,即DPA、DPB和DPC,對應的nal_unit_type 類型為 2、3和4。

通常情況我們看到的NLAU類型就是SPS、PPS、SEI、IDR的slice、非IDR這幾種。

上面站在NALU的角度看了NALU的類型、結構、數據來源、分層處理的原因等,其中NLAU最主要的目的就是傳輸視頻數據壓縮結果。那麼站在對數據本身的理解上,我們看下H.264碼流的層次結構。

H.264層次結構:

其實為了理解H.264是如何看待視頻數據,先要了解下視頻的形成過程。其實你把多副連續的有關聯圖像連續播就可以形成視頻,這主要利用了人視覺系統的暫留效應,當把連續的圖片以每秒25張的速度播放,人眼基本就感覺是連續的視頻了。動畫片就是這個原理:一張圖像裡面相鄰的區域或者一段時間內連續圖像的相同位置,像素、亮度、色溫差別比較小,所以視頻壓縮本質就是利於這種空間冗餘和時間上冗餘進行編碼,我們可以選取一段時間第一幅圖像的YUV值,後面的只需要記錄和這個的完整圖像的差別即可,同時即使記錄一副圖像的YUV值,當有鏡頭完全切換時,我們又選取切換後的第一張作為基本圖像,後面有一篇文章回講述下目前視頻壓縮的基本原理。

所以從這裡面就可以引申以下幾個概念:

所以視頻流分析的對象可以用下面的圖片描述:

如果站在數據的角度分析NALU的層次關系,如下圖:

這里視頻幀被劃分為一個片或者多個片,其中slice數據主要就是通過NLAU進行傳輸,其中slice數據又是由:

一個Slice = Silce + Slice Data

一幀圖片跟 NALU 的關聯 :

一幀圖片經過 H.264 編碼器之後,就被編碼為一個或多個片(slice),而裝載著這些片(slice)的載體,就是 NALU 了,我們可以來看看 NALU 跟片的關系(slice)。

引用自: https://www.jianshu.com/p/9522c4a7818d

Slice片類型:

設置片的目的是限制誤碼的擴散和傳輸,也就是一幀圖像中它們的編碼片是互相獨立的,這樣假設其中一張圖像的某一個片有問題導致解碼花屏,但是這個影響范圍就控制在這個片中,這就是我們平時看視頻發現只有局部花屏和綠屏的原因。

Slice Data裡面傳輸的是一個個宏塊,宏塊中的數據承載各個像素點YUV的壓縮數據。一個圖像通常被我們劃分成宏塊來研究,通常有16 16、16 8等格式。我們解碼的過程也就是恢復這些像素陣列的過程,如果知道了每個像素點的亮度和色度,就能渲染出一張完整的圖像,圖像的快速播放即是視頻。
剛才提到了宏塊.那麼什麼是宏塊呢?
宏塊是視頻信息的主要承載者。一個編碼圖像通常劃分為多個宏塊組成.包含著每一個像素的亮度和色度信息。視頻解碼最主要的工作則是提供高效的方式從碼流中獲得宏塊中像素陣列。
一個宏塊 = 一個16*16的亮度像素 + 一個8×8Cb + 一個8×8Cr彩色像素塊組成。(YCbCr 是屬於 YUV 家族的一員,在YCbCr 中 Y 是指亮度分量,Cb 指藍色色度分量,而 Cr 指紅色色度分量)
其中宏塊MB的類型:

宏塊的結構:

H.264碼流示例分析:

這里我們分析一下H.264的NLAU數據,其中包括了非VCL的NALU數據和VCL的NALU。

H.264碼流的NLAU單元:

4. 這里由於沒有數據分割機制,所以一個NALU承載一個片,同時一個片就是一個視頻幀;

4.至於NALU的非VCL數據SPS、PPS、SEI各個欄位的含義具體解析放到下篇文章,這個信息對於解碼器進行播放視頻很重要,很多播放問題都是這個數據有問題導致的;

上面看了視頻的GOP序列,視頻幀信息和片的組成,下面分析片中的宏塊信息;

H.264的層次結構:

總結:

本文主要講述了平時研究和分析視頻流對象的層次,然後這些視頻數據通過NALU傳輸時,NALU的類型和層次關系,以及NALU數據在不同層次的輸出。最後用視頻分析工具分析了H.264裸碼流驗證了上述層次關系。

所以對H.264數據分析時,一定要了解你現在分析的層次和框架,因為每個層次我們關心的數據處理對象是不一樣的,這個非常重要。

一般H.264的分析工具都是收費的,也有一些免費和裁剪版本供大家學習和使用。推薦幾個:Elecard StreamEye、CodecVisa、VideoEye、H264Analyzer、H264Visa等,有時需要交叉使用才能完成對你關心信息的分析,這些都放到我的Git上了,大家獲取使用即可。

引用原文

25fps i幀間隔50 用分析軟體查看可以看出每50幀一個i幀,並發送sps、pps、sei

sps、pps、sei、I幀綁在一起發送

⑵ 音視頻編解碼 原理

音視頻同步原理[ffmpeg]
ffmpeg對視頻文件進行解碼的大致流程:
1. 注冊所有容器格式和CODEC: av_register_all()
2. 打開文件: av_open_input_file()
3. 從文件中提取流信息: av_find_stream_info()
4. 窮舉所有的流,查找其中種類為CODEC_TYPE_VIDEO
5. 查找對應的解碼器: avcodec_find_decoder()
6. 打開編解碼器: avcodec_open()
7. 為解碼幀分配內存: avcodec_alloc_frame()
8. 不停地從碼流中提取中幀數據: av_read_frame()
9. 判斷幀的類型,對於視頻幀調用: avcodec_decode_video()
10. 解碼完後,釋放解碼器: avcodec_close()
11. 關閉輸入文件:av_close_input_file()

⑶ 什麼是視頻編碼的演算法 它有哪幾種典型的演算法 試比較各種典型的視頻編碼演算法。 謝謝了!

1、無聲時代的FLC FLC、FLI是Autodesk開發的一種視頻格式,僅僅支持256色,但支持色彩抖動技術,因此在很多情況下很真彩視頻區別不是很大,不支持音頻信號,現在看來這種格式已經毫無用處,但在沒有真彩顯卡沒有音效卡的DOS時代確實是最好的也是唯一的選擇。最重要的是,Autodesk的全系列的動畫製作軟體都提供了對這種格式的支持,包括著名的3D Studio X,因此這種格式代表了一個時代的視頻編碼水平。直到今日,仍舊有不少視頻編輯軟體可以讀取和生成這種格式。但畢竟廉頗老矣,這種格式已經被無情的淘汰。 2、載歌載舞的AVI AVI——Audio Video Interleave,即音頻視頻交叉存取格式。1992年初Microsoft公司推出了AVI技術及其應用軟體VFW(Video for Windows)。在AVI文件中,運動圖像和伴音數據是以交織的方式存儲,並獨立於硬體設備。這種按交替方式組織音頻和視像數據的方式可使得讀取視頻數據流時能更有效地從存儲媒介得到連續的信息。構成一個AVI文件的主要參數包括視像參數、伴音參數和壓縮參數等。AVI文件用的是AVI RIFF形式,AVI RIFF形式由字串「AVI」標識。所有的AVI文件都包括兩個必須的LIST塊。這些塊定義了流和數據流的格式。AVI文件可能還包括一個索引塊。 只要遵循這個標准,任何視頻編碼方案都可以使用在AVI文件中。這意味著AVI有著非常好的擴充性。這個規范由於是由微軟制定,因此微軟全系列的軟體包括編程工具VB、VC都提供了最直接的支持,因此更加奠定了AVI在PC上的視頻霸主地位。由於AVI本身的開放性,獲得了眾多編碼技術研發商的支持,不同的編碼使得AVI不斷被完善,現在幾乎所有運行在PC上的通用視頻編輯系統,都是以支持AVI為主的。AVI的出現宣告了PC上啞片時代的結束,不斷完善的AVI格式代表了多媒體在PC上的興起。 說到AVI就不能不提起英特爾公司的Indeo video系列編碼,Indeo編碼技術是一款用於PC視頻的高性能的、純軟體的視頻壓縮/解壓解決方案。Indeo音頻軟體能提供高質量的壓縮音頻,可用於互聯網、企業內部網和多媒體應用方案等。它既能進行音樂壓縮也能進行聲音壓縮,壓縮比可達8:1而沒有明顯的質量損失。Indeo技術能幫助您構建內容更豐富的多媒體網站。目前被廣泛用於動態效果演示、游戲過場動畫、非線性素材保存等用途,是目前使用最廣泛的一種AVI編碼技術。現在Indeo編碼技術及其相關軟體產品已經被Ligos Technology 公司收購。隨著MPEG的崛起,Indeo面臨著極大的挑戰。 3、容量與質量兼顧的MPEG系列編碼 和AVI相反,MPEG不是簡單的一種文件格式,而是編碼方案。 MPEG-1(標准代號ISO/IEC11172)制定於1991年底,處理的是標准圖像交換格式(standard interchange format,SIF)或者稱為源輸入格式(Source Input Format,SIF)的多媒體流。是針對1.5Mbps以下數據傳輸率的數字存儲媒質運動圖像及其伴音編碼(MPEG-1 Audio,標准代號ISO/IEC 11172-3)的國際標准,伴音標准後來衍生為今天的MP3編碼方案。MPEG-1規范了PAL制(352*288,25幀/S)和NTSC制(為352*240,30幀/S)模式下的流量標准, 提供了相當於家用錄象系統(VHS)的影音質量,此時視頻數據傳輸率被壓縮至1.15Mbps,其視頻壓縮率為26∶1。使用MPEG-1的壓縮演算法,可以把一部120分鍾長的多媒體流壓縮到1.2GB左右大小。常見的VCD就是MPEG-1編碼創造的傑作。MPEG-1編碼也不一定要按PAL/NTSC規范的標准運行,你可以自由設定影像尺寸和音視頻流量。隨著光頭拾取精度的提高,有人把光碟的信息密度加大,並適度降低音頻流流量,於是出現了只要一張光碟就存放一部電影的DVCD。DVCD碟其實是一種沒有行業標准,沒有國家標准,更談不上是國際標準的音像產品。 當VCD開始向市場普及時,電腦正好進入了486時代,當年不少朋友都夢想擁有一塊硬解壓卡,來實現在PC上看VCD的夙願,今天回過頭來看看,覺得真有點不可思議,但當時的現狀就是486

⑷ 音視頻解碼與播放

YUV定義:分為三個分量,

「Y」表示 明亮度 也就是 灰度值 ,而「U」和「V」 表示的則是 色度 飽和度 ,作用是描述影像色彩及飽和度,用於指定像素的顏色。

I frame :幀內編碼幀 ,I 幀通常是每個 GOP(MPEG 所使用的一種視頻壓縮技術)的第一個幀,經過適度地壓縮,做為隨機訪問的參考點,可以當成圖象。I幀可以看成是一個圖像經過壓縮後的產物。
自身可以通過視頻解壓演算法解壓成一張單獨的完整的圖片。

P frame: 前向預測編碼幀 ,通過充分將低於圖像序列中前面已編碼幀的時間冗餘信息來壓縮傳輸數據量的編碼圖像,也叫預測幀;
需要參考其前面的一個I frame 或者P frame來生成一張完整的圖片。

B frame: 雙向預測內插編碼幀 ,既考慮與源圖像序列前面已編碼幀,也顧及源圖像序列後面已編碼幀之間的時間冗餘信息來壓縮傳輸數據量的編碼圖像,也叫雙向預測幀;
要參考其前一個I或者P幀及其後面的一個P幀來生成一張完整的圖片。

PTS:Presentation Time Stamp 。PTS主要用於度量解碼後的視頻幀 什麼時候被顯示出來

DTS:Decode Time Stamp 。DTS主要是標識讀入內存中的幀數據在 什麼時候開始送入解碼器 中進行解碼。

在沒有B幀存在的情況下DTS的順序和PTS的順序應該是一樣的。

DTS主要用於視頻的解碼,在解碼階段使用。PTS主要用於視頻的同步和輸出.在顯示的時候使用。

通常所說的音頻裸數據就是PCM(Pulse Codec Molation脈沖編碼調制)

libavformat

用於各種音視頻封裝格式的生成和解析 ,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;音視頻的格式解析協議,為 libavcodec 分析碼流提供獨立的音頻或視頻碼流源。

libavcodec

用於各種類型聲音/圖像編解碼 ;該庫是音視頻編解碼核心,實現了市面上可見的絕大部分解碼器的功能,libavcodec 庫被其他各大解碼器 ffdshow,Mplayer 等所包含或應用。

libavfilter

filter(FileIO、FPS、DrawText) 音視頻濾波器的開發 ,如水印、倍速播放等。

libavutil

包含一些 公共的工具函數 的使用庫,包括算數運算 字元操作。

libswresample

原始音頻格式轉碼

libswscale

原始視頻格式轉換 )用於視頻場景比例縮放、色彩映射轉換;圖像顏色空間或格式轉換,如 rgb565,rgb888 等與 yuv420 等之間轉換。

閱讀全文

與軍用音視頻編解碼演算法相關的資料

熱點內容
解壓文件蘋果手機rar 瀏覽:145
centos開機命令行模式 瀏覽:695
遍歷所有listpython 瀏覽:660
力控加密文件夾 瀏覽:515
如何更改移動伺服器密碼 瀏覽:686
蘋果8p手機加密 瀏覽:749
ipad建文件夾怎麼弄 瀏覽:833
iphone13對wap3加密 瀏覽:555
pdf文件打開失敗 瀏覽:913
dubbo怎麼調用不同伺服器介面 瀏覽:40
全能解壓王app歷史版本 瀏覽:75
優先隊列與拓撲排序演算法 瀏覽:281
pdf轉換formacbook 瀏覽:871
pdf文件內容怎麼編輯 瀏覽:48
134壓縮機排氣溫度多少 瀏覽:256
unity等待編譯後 瀏覽:806
黑鯊手機鎖屏視頻在哪個文件夾 瀏覽:781
wow地圖解壓後怎麼壓縮 瀏覽:823
有pdf卻打不開 瀏覽:462
七星彩軟體app怎麼下載 瀏覽:219