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

音視頻編解碼演算法

發布時間:2022-11-28 20:14:21

❶ 視頻的編碼方式有哪些與格式一樣嗎

視頻格式是指視頻文件的存在形式,比如AVI、RMVB、MKV等等,也可以說是封裝壓縮視頻和音頻文件的容器。

音頻數字化主要有壓縮與非壓縮兩種方式。較早出現的數字音頻播放機,如CD唱機和DAT錄音機,均採用線性PCM編碼來存儲音樂信號,為非壓縮方式。在高質量要求的音頻工作站和數字錄像機(如DVCPRO)上,也採用非壓縮的格式。

音視頻編碼:

我們常見的MPEG、Dolby Digital、DTS等則為壓縮方式。壓縮分為有損壓縮和無損壓縮。有損壓縮的目的是提高壓縮率,降低佔用系統資源。可以根據實際需要選用不同的采樣速率、樣本解析度(精度)和數據率。

數字衛星廣播系統的信源編碼技術採用MPEG-2.5第三層聲音編碼演算法。第三層編碼演算法最復雜、延時最大、效率最高。因此對一定的數據速率,第三層協議得到的音質最好。當然,用戶可根據需要選擇8—128Kbps范圍的不同速率。聲音質量可達到CD音質。

❷ 音視頻解碼與播放

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 等之間轉換。

❸ Android -- 音視頻基礎知識

幀,是視頻的一個基本概念,表示一張畫面,如上面的翻頁動畫書中的一頁,就是一幀。一個視頻就是由許許多多幀組成的。

幀率,即單位時間內幀的數量,單位為:幀/秒 或fps(frames per second)。一秒內包含多少張圖片,圖片越多,畫面越順滑,過渡越自然。 幀率的一般以下幾個典型值:

24/25 fps:1秒 24/25 幀,一般的電影幀率。

30/60 fps:1秒 30/60 幀,游戲的幀率,30幀可以接受,60幀會感覺更加流暢逼真。

85 fps以上人眼基本無法察覺出來了,所以更高的幀率在視頻里沒有太大意義。

這里我們只講常用到的兩種色彩空間。

RGB的顏色模式應該是我們最熟悉的一種,在現在的電子設備中應用廣泛。通過R G B三種基礎色,可以混合出所有的顏色。

這里著重講一下YUV,這種色彩空間並不是我們熟悉的。這是一種亮度與色度分離的色彩格式。

早期的電視都是黑白的,即只有亮度值,即Y。有了彩色電視以後,加入了UV兩種色度,形成現在的YUV,也叫YCbCr。

Y:亮度,就是灰度值。除了表示亮度信號外,還含有較多的綠色通道量。

U:藍色通道與亮度的差值。

V:紅色通道與亮度的差值。

音頻數據的承載方式最常用的是 脈沖編碼調制 ,即 PCM

在自然界中,聲音是連續不斷的,是一種模擬信號,那怎樣才能把聲音保存下來呢?那就是把聲音數字化,即轉換為數字信號。

我們知道聲音是一種波,有自己的振幅和頻率,那麼要保存聲音,就要保存聲音在各個時間點上的振幅。

而數字信號並不能連續保存所有時間點的振幅,事實上,並不需要保存連續的信號,就可以還原到人耳可接受的聲音。

根據奈奎斯特采樣定理:為了不失真地恢復模擬信號,采樣頻率應該不小於模擬信號頻譜中最高頻率的2倍。

根據以上分析,PCM的採集步驟分為以下步驟:

采樣率,即采樣的頻率。

上面提到,采樣率要大於原聲波頻率的2倍,人耳能聽到的最高頻率為20kHz,所以為了滿足人耳的聽覺要求,采樣率至少為40kHz,通常為44.1kHz,更高的通常為48kHz。

采樣位數,涉及到上面提到的振幅量化。波形振幅在模擬信號上也是連續的樣本值,而在數字信號中,信號一般是不連續的,所以模擬信號量化以後,只能取一個近似的整數值,為了記錄這些振幅值,采樣器會採用一個固定的位數來記錄這些振幅值,通常有8位、16位、32位。

位數越多,記錄的值越准確,還原度越高。

最後就是編碼了。由於數字信號是由0,1組成的,因此,需要將幅度值轉換為一系列0和1進行存儲,也就是編碼,最後得到的數據就是數字信號:一串0和1組成的數據。

整個過程如下:

聲道數,是指支持能不同發聲(注意是不同聲音)的音響的個數。 單聲道:1個聲道
雙聲道:2個聲道
立體聲道:默認為2個聲道
立體聲道(4聲道):4個聲道

碼率,是指一個數據流中每秒鍾能通過的信息量,單位bps(bit per second)

碼率 = 采樣率 * 采樣位數 * 聲道數

這里的編碼和上面音頻中提到的編碼不是同個概念,而是指壓縮編碼。

我們知道,在計算機的世界中,一切都是0和1組成的,音頻和視頻數據也不例外。由於音視頻的數據量龐大,如果按照裸流數據存儲的話,那將需要耗費非常大的存儲空間,也不利於傳送。而音視頻中,其實包含了大量0和1的重復數據,因此可以通過一定的演算法來壓縮這些0和1的數據。

特別在視頻中,由於畫面是逐漸過渡的,因此整個視頻中,包含了大量畫面/像素的重復,這正好提供了非常大的壓縮空間。

因此,編碼可以大大減小音視頻數據的大小,讓音視頻更容易存儲和傳送。

視頻編碼格式有很多,比如H26x系列和MPEG系列的編碼,這些編碼格式都是為了適應時代發展而出現的。

其中,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)國際電傳視訊聯盟主導

MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的組織)主導。

當然,他們也有聯合制定的編碼標准,那就是現在主流的編碼格式H264,當然還有下一代更先進的壓縮編碼標准H265。

H264是目前最主流的視頻編碼標准,所以我們後續的文章中主要以該編碼格式為基準。

H264由ITU和MPEG共同定製,屬於MPEG-4第十部分內容。

我們已經知道,視頻是由一幀一幀畫面構成的,但是在視頻的數據中,並不是真正按照一幀一幀原始數據保存下來的(如果這樣,壓縮編碼就沒有意義了)。

H264會根據一段時間內,畫面的變化情況,選取一幀畫面作為完整編碼,下一幀只記錄與上一幀完整數據的差別,是一個動態壓縮的過程。

在H264中,三種類型的幀數據分別為

I幀:幀內編碼幀。就是一個完整幀。

P幀:前向預測編碼幀。是一個非完整幀,通過參考前面的I幀或P幀生成。

B幀:雙向預測內插編碼幀。參考前後圖像幀編碼生成。B幀依賴其前最近的一個I幀或P幀及其後最近的一個P幀。

全稱:Group of picture。指一組變化不大的視頻幀。

GOP的第一幀成為關鍵幀:IDR

IDR都是I幀,可以防止一幀解碼出錯,導致後面所有幀解碼出錯的問題。當解碼器在解碼到IDR的時候,會將之前的參考幀清空,重新開始一個新的序列,這樣,即便前面一幀解碼出現重大錯誤,也不會蔓延到後面的數據中。

DTS全稱:Decoding Time Stamp。標示讀入內存中數據流在什麼時候開始送入解碼器中進行解碼。也就是解碼順序的時間戳。

PTS全稱:Presentation Time Stamp。用於標示解碼後的視頻幀什麼時候被顯示出來。

前面我們介紹了RGB和YUV兩種圖像色彩空間。H264採用的是YUV。

YUV存儲方式分為兩大類:planar 和 packed。

planar如下:

packed如下:

上面說過,由於人眼對色度敏感度低,所以可以通過省略一些色度信息,即亮度共用一些色度信息,進而節省存儲空間。因此,planar又區分了以下幾種格式:YUV444、 YUV422、YUV420。

YUV 4:4:4采樣,每一個Y對應一組UV分量。

YUV 4:2:2采樣,每兩個Y共用一組UV分量。

YUV 4:2:0采樣,每四個Y共用一組UV分量。

其中,最常用的就是YUV420。

YUV420屬於planar存儲方式,但是又分兩種類型:

YUV420P:三平面存儲。數據組成為YYYYYYYYUUVV(如I420)或YYYYYYYYVVUU(如YV12)。

YUV420SP:兩平面存儲。分為兩種類型YYYYYYYYUVUV(如NV12)或YYYYYYYYVUVU(如NV21)

原始的PCM音頻數據也是非常大的數據量,因此也需要對其進行壓縮編碼。

和視頻編碼一樣,音頻也有許多的編碼格式,如:WAV、MP3、WMA、APE、FLAC等等,音樂發燒友應該對這些格式非常熟悉,特別是後兩種無損壓縮格式。

但是,我們今天的主角不是他們,而是另外一個叫AAC的壓縮格式。

AAC是新一代的音頻有損壓縮技術,一種高壓縮比的音頻壓縮演算法。在MP4視頻中的音頻數據,大多數時候都是採用AAC壓縮格式。

AAC格式主要分為兩種:ADIF、ADTS。

ADIF:Audio Data Interchange Format。音頻數據交換格式。這種格式的特徵是可以確定的找到這個音頻數據的開始,不需進行在音頻數據流中間開始的解碼,即它的解碼必須在明確定義的開始處進行。這種格式常用在磁碟文件中。

ADTS:Audio Data Transport Stream。音頻數據傳輸流。這種格式的特徵是它是一個有同步字的比特流,解碼可以在這個流中任何位置開始。它的特徵類似於mp3數據流格式。

ADIF數據格式:

ADTS 一幀 數據格式(中間部分,左右省略號為前後數據幀):

AAC內部結構也不再贅述,可以參考AAC 文件解析及解碼流程

細心的讀者可能已經發現,前面我們介紹的各種音視頻的編碼格式,沒有一種是我們平時使用到的視頻格式,比如:mp4、rmvb、avi、mkv、mov...

沒錯,這些我們熟悉的視頻格式,其實是包裹了音視頻編碼數據的容器,用來把以特定編碼標准編碼的視頻流和音頻流混在一起,成為一個文件。

例如:mp4支持H264、H265等視頻編碼和AAC、MP3等音頻編碼。

我們在一些播放器中會看到,有硬解碼和軟解碼兩種播放形式給我們選擇,但是我們大部分時候並不能感覺出他們的區別,對於普通用戶來說,只要能播放就行了。

那麼他們內部究竟有什麼區別呢?

在手機或者PC上,都會有CPU、GPU或者解碼器等硬體。通常,我們的計算都是在CPU上進行的,也就是我們軟體的執行晶元,而GPU主要負責畫面的顯示(是一種硬體加速)。

所謂軟解碼,就是指利用CPU的計算能力來解碼,通常如果CPU的能力不是很強的時候,一則解碼速度會比較慢,二則手機可能出現發熱現象。但是,由於使用統一的演算法,兼容性會很好。

硬解碼,指的是利用手機上專門的解碼晶元來加速解碼。通常硬解碼的解碼速度會快很多,但是由於硬解碼由各個廠家實現,質量參差不齊,非常容易出現兼容性問題。

MediaCodec 是Android 4.1(api 16)版本引入的編解碼介面,是所有想在Android上開發音視頻的開發人員繞不開的坑。

由於Android碎片化嚴重,雖然經過多年的發展,Android硬解已經有了很大改觀,但實際上各個廠家實現不同, 還是會有一些意想不到的坑。

相對於FFmpeg,Android原生硬解碼還是相對容易入門一些,所以接下來,我將會從MediaCodec入手,講解如何實現視頻的編解碼,以及引入OpenGL實現對視頻的編輯,最後才引入FFmpeg來實現軟解,算是一個比較常規的音視頻開發入門流程吧。

❹ 音視頻編碼格式認知

編碼格式對應的就是音頻編碼和視頻編碼,

音頻編碼標准和視頻編碼標准,每種編碼標准都對應的編碼演算法,其目的是通過一定編碼演算法實現數據的壓縮、減少數據的冗餘。

視頻編碼指的是通過特定的壓縮技術,將某個視頻文件格式轉換為另一種視頻格式文件的方式

可變碼率指的是輸出碼流的碼率是可變的,因為視頻信源本身的高峰信息量是變化的,從確保視頻傳輸質量和充分利用信息的角度來說,可變碼率視頻編碼才是最合理的。

相關資料免費分享,領取方式見下方騰訊文檔

C++音視頻開發學習資料 :點擊領取 音視頻開發(資料文檔+視頻教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

是指視頻成像產品所形成的圖像大小或尺寸,常見的 1080P、4K 等又代表什麼呢,P 本身的含義是逐行掃描,表示視頻像素的總行數,

1080P 表示總共有 1080 行的像素數,而 K 表示視頻像素的總列數,4K 表示有 4000 列的像素數,

通常來說,1080P 就是指 1080 x 1920 的解析度,4 k 指 3840 x 2160 的解析度。

視頻編碼:

Xvid(舊稱為XviD)

是一個開放源代碼的MPEG-4影像編解碼器,是由一群原OpenDivX開發者在OpenDivX於2001年7月停止開發後自行開發的。

Xvid支持量化(Quantization)、范圍控制的運動偵測(Motion Search)、碼率曲線分配(Curve)、動態關鍵幀距(I-frame interval)、心理視覺亮度修正、演職員表選項、外部自定義控制、運動向量加速(Hinted ME)編碼、畫面優化解碼等眾多編碼技術,對用戶來說功能十分強大。

DivX是由MPEG-4衍生出的一種視頻編碼(壓縮)標准,也即我們通常所說的DVDrip格式,

它採用了MPEG4的壓縮演算法,同時又綜合了MPEG-4與MP3各方面的技術,說白了就是使用DivX壓縮技術對DVD碟片的視頻圖像進行高質量壓縮,

同時用MP3或AC3對音頻進行壓縮,然後再將視頻與音頻合成,並加上相應的外掛字幕文件而形成的視頻格式。其畫質直逼DVD,而體積只有DVD的數分之 一。

XviD與DivX幾乎相同,是開源的DivX,不收費,而使用DivX要收費。

H.264是一種高性能的視頻編解碼技術。

目前國際上制定視頻編解碼技術的組織有兩個,一個是「國際電聯(ITU-T)」,它制定的標准有H.261、H.263、H.263+等,

另一個是「國際標准化組織(ISO)」它制定的標准有MPEG-1、MPEG-2、MPEG-4等。

而H.264則是由兩個組織聯合組建的聯合視頻組(JVT)共同制定的新數字視頻編碼標准,

所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高級視頻編碼(Advanced Video Coding,AVC),而且它將成為MPEG-4標準的第10部分。

因此,不論是MPEG-4 AVC、MPEG-4 Part 10,還是ISO/IEC 14496-10,都是指H.264。

H.264最具價值的部分是更高的數據壓縮比,在同等的圖像質量,H.264的數據壓縮比能比DVD系統中使用的 MPEG-2高2 3倍,比MPEG-4高1.5 2倍。

舉個例子,原始文件的大小如果為100GB,採用MPEG-2壓縮標准壓縮後變成4GB,壓縮比為25 1,而採用H.264壓縮標准壓縮後變為1GB,從100GB到1GB,H.264的壓縮比達到驚人的100 1。尤其值得一提的是,H.264在具有高壓縮比的同時還擁有高質量流暢的圖像。

微軟是在2003年9月遞交VC-1編碼格式的,目前已經得到了MovieBeam、Modeo等不少公司的採納,同時也包含在HD DVD和藍光中,包括華納和環球等影業公司也有採用這種格式的意向。

VC-1基於微軟Windows Media Video9(WMV9)格式,而WMV9格式現在已經成為VC-1標準的實際執行部分。WMV (Windows Media

Video)是微軟公司的視頻編解碼器家族,包括WMV7、WMV8、WMV9、WPV10。這一族的編解碼器可以應用在從撥號上網的窄帶視頻到高清晰度電視HDTV)的寬頻視頻。使用Windows Media Video用戶還可以將視頻文件刻錄到CD、DVD或者其它一些設備上。它也

適用於用作媒體伺服器。

WMV可以被看作是MPEG-4的一個增強版本。最新的由SMPTE(電視電影工程師協會)承認的WMV-9,也就是我們說的上面的VC-1。

同一個 AVCodecID 可能對應多個不同的編解碼器 (AVCodec) MPEG-4 AVC、MPEG-4 Part 10,還是ISO/IEC 14496-10,都是指H.264。

在編碼方式相同相同的情況下,.avi, .mkv, .mp4隻是封裝格式的區別(文件後綴格式),而封裝格式是不影響畫質的。

就相當於你的100塊錢折一下,或者兩下,或者兩下後不管是放在你的口袋裡,錢包里還是存錢罐里都是100塊錢。

這里的100塊錢就是就是視頻數據,你把100塊折一下,或者兩下,或者兩下就是編碼格式,錢包,口袋,存錢罐就是封裝格式。

❺ 計算機中的音頻和視頻的編碼方式

音頻信號的編碼方式大致分為三大類:
(1) 波形編碼,如PCM、APC、SDC、ATC
(2) 分析合成方法,如LPC
(3) 混合編碼方法
常用的編碼方式是PCM——脈沖調制。脈沖編碼調制(PCM)是把模擬信號變換為數字信號的一種調制方式,即把連續輸入的模擬信號變換為在時域和振幅上都離散的量,然後將其轉化為代碼形式傳輸或存儲。
音頻信號壓縮編碼的主要依據是人耳的聽覺特性,主要有兩點:
1.人的聽覺系統中存在一個聽覺閾值電平,低於這個電平的聲音信號人耳聽不到 .
2.人的聽覺存在屏蔽效應。當幾個強弱不同的聲音同時存在時,強聲使弱聲難以聽到,並且兩者之間的關系與其相對頻率的大小有關 .
3.對聲音波形采樣後,相鄰樣值之間存在著很強的相關性。
聲音編碼演算法就是通過這些特性來去掉更多的冗餘數據,來達到壓縮數據的目的。

視頻信號的壓縮與編碼
采樣、量化後的信號轉換成數字元號才能進行傳輸,這一過程稱為編碼。

視頻壓縮編碼的理論基礎是資訊理論。信息壓縮就是從時間域、空間域兩方面去除冗餘信息,將可推知的確定信息去掉。
視頻編碼技術主要包括MPEG與H.261標准,編碼技術主要分成幀內編碼和幀間編碼。前者用於去掉圖像的空間冗餘信息,後者用於去除圖像的時間冗餘信息。

呃,還好以前的課件還留著,稍稍拷了點過來。。

❻ 音視頻入門——H.264編碼(宏塊+片+幀)淺析

(1)圖像冗餘信息:空間冗餘、時間冗餘
(2)視頻編碼關鍵點:壓縮比、演算法復雜度、還原度
(3)H.264的2大組成部分:視頻編碼層VCL和網路抽象層面NAL Network Abstract Layer,

(1)宏塊 MB macroblock
(2)片 slice
(3)幀 frame
(4)I幀、B幀、P幀

(5)幀率 fps
(6)像素->宏塊->片->幀->序列->碼流

我們了解了什麼是宏快,宏快作為壓縮視頻的最小的一部分,需要被組織,然後在網路之間做相互傳輸。

H264更深層次 —》宏塊 太淺了

如果單純的用宏快來發送數據是雜亂無章的,就好像在沒有集裝箱 出現之前,貨物總是隨意被堆放到船上。

上貨(編碼),下貨是非常痛苦的。 當集裝箱出現之後,一切都發生了改變,傳輸效率大大增高。

集裝箱可以理解成H264編碼標准,他制定了相互傳輸的格式,將宏快 有組織,有結構,有順序的形成一系列的碼流。這種碼流既可 通過 InputStream 網路流的數據進行傳輸,也可以封裝成一個文件進行保存

H264: H264/AVC是廣泛採用的一種編碼方式 。 主要作用是為了傳輸

組成H264碼流的結構中 包含以下幾部分 ,從大到小排序依次是

NAL層:(Network Abstraction Layer,視頻數據網路抽象層): 它的作用是H264隻要在網路上傳輸,在傳輸的過程每個包乙太網是1500位元組,而H264的幀往往會大於1500位元組,所以要進行拆包,將一個幀拆成多個包進行傳輸,所有的拆包或者組包都是通過NAL層去處理的。
VCL層:(Video Coding Layer,視頻數據編碼層): 對視頻原始數據進行壓縮

H264是一種碼流 類似與一種不見頭,也不見尾的一條河流。如何從和流中取到自己想要的數據呢,

在H264的標磚中有這樣的一個封裝格式叫做"Annex-B"的位元組流格式。 它是H264編碼的主要位元組流格式。

幾乎市面上的編碼器是以這種格式進行輸出的。起始碼0x 00 00 00 01 或者 0x 00 00 01 作為分隔符。

兩個 0x 00 00 00 01之間的位元組數據 是表示一個NAL Unit

切片頭:包含了一組片的信息,比如片的數量,順序等等

H264中,以16x16的宏塊為編碼最小單元,一個宏塊可以被分成多個4x4或8x8的塊
同一個宏塊內,像素的相似程度會比較高,若16x16的宏塊中,像素相差較大,那麼就需要繼續細分

當然,像素塊越小,編碼的復雜度也會隨之增加,編碼效率自然就會降低。但是這樣是值得的,因為圖像的壓縮效率有了顯著提高,也就是編碼後得到的相同質量的圖像,H.264的壓縮比更大,佔用的空間及帶寬更小。

不合理的分塊會出現塊效應,即塊與塊之間色差明顯
海思在3559之後有deblock的介面可以應對塊效應,3519上用的很多

在I幀中,全部宏塊都採用幀內預測的方式,所以解碼時僅用I幀的數據就可重構完整圖像,不須要參考其餘畫面而生成。web

H.264中規定了兩種類型的I幀:普通I幀(normal Iframes)和IDR幀(InstantaneousDecoding Refresh, 即時解碼刷新)。 IDR幀實質也是I幀,使用幀內預測。IDR幀的做用是當即刷新,會致使DPB(Decoded Picture Buffer參考幀列表)清空,而I幀不會。因此IDR幀承擔了隨機訪問功能,一個新的IDR幀開始,能夠從新算一個新的Gop開始編碼,播放器永遠能夠從一個IDR幀播放,由於在它以後沒有任何幀引用以前的幀。若是一個視頻中沒有IDR幀,這個視頻是不能隨機訪問的。全部位於IDR幀後的B幀和P幀都不能參考IDR幀之前的幀,而普通I幀後的B幀和P幀仍然能夠參考I幀以前的其餘幀。IDR幀阻斷了偏差的積累,而I幀並無阻斷偏差的積累。演算法

一個GOP序列的第一個圖像叫作 IDR 圖像(當即刷新圖像),IDR 圖像都是 I 幀圖像,但I幀不必定都是IDR幀,只有GOP序列的第1個I幀是IDR幀。緩存

疑問:按照GOP、IDR幀、I幀的解釋,若是一個GOP出現除去第一個IDR幀以外的I幀,是不存在的,那這樣的話,就不存在非IDR的I幀了,但是為何還要說明非IDR的I幀呢。svg

解答:H264編碼存在多種編碼方式CBR、VBR、CVBR、ABR等等,VBR編碼模式下圖像內容變化差別很大時,會動態調整I幀的數量,所以GOP的概念須要修正:兩個IDR幀之間的間隔為一組GOP,一組GOP中能夠出現非IDR的I幀。編碼

P幀:前向預測編碼幀。P幀表示的是這一幀跟以前的一個關鍵幀(或P幀)的差異,解碼時須要用以前緩存的畫面疊加上本幀定義的差異,生成最終畫面,P幀沒有完整畫面數據,只有與前一幀的畫面差別的數據。P幀的壓縮率20code

B幀:雙向預測內插編碼幀。B幀是雙向差異幀,也就是B幀記錄的是本幀與先後幀的差異,要解碼B幀,不只要取得以前的緩存畫面,還要解碼以後的畫面,經過先後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,約為50,可是解碼時CPU會比較累。orm

通常能夠輸出H264幀的USB攝像頭,使用的是BP-Baseline Profile,只有I幀與P幀。視頻

而slice呢,也是對宏塊的劃分

本文簡單敘述了;音視頻中的H264編碼中的,宏塊、幀、片。音視頻還有更深入的學習,知識范圍很廣,需要一套很詳細的學習資料與路線。我推薦上面的一套入門到精通資料輔佐。

❼ 想了解下,會暢有沒有和算力相關的技術它在雲視頻底層演算法和技術的投入有哪些

會暢注重雲視頻底層演算法和技術的投入,在雲平台底層架構上採用了業界領先的SVC/HEVC(H.264/H.265)柔性音視頻編解碼演算法,可以極高的效率壓縮音視頻數據,使音視頻數據得以自適應網路帶寬的方式在開放的互聯網上傳輸,達到接近傳統專網視頻會議的流暢體驗。SVC/HEVC柔性音視頻編解碼演算法相比傳統專網視頻所採用的H.264的通用編解碼協議,在效率上有50%-80%的提升,能在互聯網中40%-50%丟包視頻流暢穩定不卡頓,60%-70%丟包音視頻連貫清晰,為行業帶來了全新的下一代用戶體驗。這又使得傳統專網視頻通信固有的MCU(多點控制單元)得以雲化,極大降低用戶的采購成本和使用門檻。 同時,會暢持續投入構建下一代三維雲視頻平台߅在原有自主音視頻演算法引擎基礎上,結合3D引擎,在雙引擎的驅動下實現了三維化雲視頻技術應用,並已在2021年期間將三維雲視頻產品化和試商業化。另外,會暢在雲平台的架構設計上,一方面考慮了面向國產化應用,積極研發適配內置於國產統一操作系統UOS的會暢超視雲,支持包括龍芯、兆芯、鯤鵬、飛騰在內的主流國產晶元;另一方面也在研發支持5G大規模商用,支持4K/8K超清視頻的大規模應用,在下一代音視頻編解碼演算法H.265和AV1上亦有技術布局。

❽ 二、視頻編解碼基礎知識

圖像信息經採集後生成的原始視頻數據,數據量非常大,對於某些採集後直接本地播放的應用場合,不需要考慮壓縮技術。但現實中更多的應用場合,涉及視頻的傳輸與存儲,傳輸網路與存儲設備無法容忍原始視頻數據的巨大數據量,必須將原始視頻數據經過編碼壓縮後,再進行傳輸與存儲。

(1)未經壓縮的數字視頻的數據量巨大
(2)存儲困難,如:一張DVD只能存儲幾秒鍾的未壓縮數字視頻
(3)傳輸困難,如:1兆的帶寬傳輸一秒的數字電視視頻需要大約4分鍾,720p RGB 15幀每秒碼率計算: 1280 x 720 x 3 x 15 ≈ 41MB ≈ 331Mb

將視頻數據中的冗餘信息去除,尋找像素之間的相關性,還有不同時間的圖像幀之間的相關性。

視頻編碼 是壓縮和可能改變視頻內容格式的過程,有時甚至將模擬源更改為數字源。在壓縮方面,目標是減少佔用空間。這是因為它是一個有損的過程,會拋棄與視頻相關的信息。在解壓縮以進行回放時,創建原始的近似值。應用的壓縮越多,拋出的數據越多,近似值與原始數據相比越差。

視頻編解碼器是通過軟體或硬體應用程序完成的視頻壓縮標准。編解碼器,如:H.264,VP8,RV40以及其他標准或更高版本(VP9)

註:音頻編解碼器,如:LAME / MP3,Fraunhofer FDK AAC,FLAC等。

根據已經編碼好的塊信息得到一個預測值,這樣只需要編碼實際值與預測值之間的差異即可。
空間冗餘的消除:
幀內預測:根據同一幀中相鄰已編碼好的塊信息得到預測數據,編碼差異數據
時間冗餘的消除:
幀間預測:根據已編碼幀中的塊信息得到預測數據,編碼差異數據

I 幀:僅採用幀內壓縮技術,壓縮效率最低,編解碼無需用到其他幀的信息,是GOP的起始點。
P 幀:前向預測幀,編解碼只參考前一個幀,可作為其他圖像編碼時的參考幀,屬幀間壓縮技術。
B 幀:雙向預測幀,編解碼既參考前一幀也可參考後一幀,壓縮效率最高,復雜度高,時延較大,屬幀間壓縮技術。

GOP(group of pictures)一般指兩個I幀之間的間隔幀數,兩個I幀之間是一個圖像序列,在一個圖像序列中只有一個I幀。

H.264 原始碼流(⼜稱為 裸流),是由⼀個接⼀個的 NALU 組成的,而它的功能分為兩層:視頻編碼層VCL 和 網路提取層NAL。

VCL負責有效表示視頻數據的內容。
H264除了實現了對視頻的壓縮處理之外,為了方便網路傳輸,提供了對應的視頻編碼和分片策略;類似於網路數據封裝成IP幀,在H264中將其稱為組(gop)、片(slice)、宏塊(Macroblock)這些一起組成了H264的碼流分層結構;H264將其組織成為序列(GOP)、圖片(pictrue)、片(Slice)、宏塊(Macroblock)、子塊(subblock)五個層次。

宏塊:視頻編碼的基本單元,h264通常宏塊大小為16x16個像素,所以編碼器一般會對圖像的寬 高有要求,需要為16的倍數。
Slice:條帶,圖像的劃分,一幀圖像可編碼成一個或者多個條帶,每條帶包含整數個宏塊。
SPS: 序列參數集,包含應用於完整視頻序列的語法元素,比如圖像寬,高等。
PPS: 圖像參數集,包含應用於編碼圖像的語法元素,比如量化參數,參考幀列表大小等。

NAL定義了數據封裝的格式和統一的網路介面,負責格式化VCL數據並提供頭信息,以保證數據適合各種信道和存儲介質上的傳輸。
NAL基本單元為NALU,每一個NALU包含一個位元組的頭信息和其後的負載數據。

參考文檔
https://zhuanlan.hu.com/p/31056455
https://blog.csdn.net/knowledgebao/article/details/86716428
重點鏈接:NAL/NALU詳解可以查閱:
https://www.jianshu.com/p/1b3f8187b271
http://www.wendangku.net/doc/039e95757fd5360cba1adb46.html

附上幾篇文章:
https://blog.csdn.net/knowledgebao/article/details/86716428
https://zhuanlan.hu.com/p/31056455
https://www.jianshu.com/p/0c296b05ef2a

Android平台市面上大部分的晶元廠商的硬編硬解都適配,例如:高通,三星Exynos,聯發科,海思等;windows平台上支持Intel qsv硬編硬解。

解析度:(矩形)圖片的長度和寬頻,即圖片的尺寸。影響圖像大小,與圖像大小成正比;解析度越高,圖像越大;解析度越低,圖像越小。
解析度是指視頻畫面橫向和縱向被切分成多少塊。
區別 1080P , 3MP ,4K
P 720P 、1080P 表示的是"視頻像素的總函數" ,' P ' (Progressive的縮寫)表示的是"逐行掃描"
K 2K 、4K 等是表示 "視頻像素的總列數" ,4K表示的是視頻有4000列的像素數,具體是3840列或4096列。
MP 代表的是像素總數,指像素的行數(P)與列數(K)相乘後的一個結果(百萬像素)。

幀率 是指每秒圖像的數量,一幀代表的就是一副靜止的畫面,連續的幀就形成了動畫。影響畫面流暢度,與畫面流暢度成正比:幀率越大,畫面越流暢;幀率越小,畫面越有跳動感。幀率就是在1秒鍾時間里傳輸的圖片的幀數,也可以理解為圖形處理器每秒鍾能夠刷新幾次。

碼率 指編碼器每秒編出的數據大小,單位是kbps 。
視頻文件在單位時間內使用的數據流量,指把每秒顯示的圖片進行壓縮後的數據量。影響體積,與體積成正比:碼率越大,體積越大,碼率越小,體積越小。(體積=碼率X時間)
壓縮前的每秒數據量 = 幀率 x 解析度(單位是位元組)
壓縮比 = 壓縮前的每秒數據量 / 碼率(對於同一視頻源並採用同一種視頻編碼演算法,壓縮比越高,畫面質量越差)

清晰度
在碼率一定的情況下,解析度與清晰度成反比關系:解析度越高,圖像越不清晰,解析度越低,圖像越清晰。
在解析度一定的情況下,碼率與清晰度成正比關系,碼率越高,圖像越清晰;碼率越低,圖像越不清晰。
好文章理解解析度、幀率和碼率三者之間的關系: https://blog.csdn.net/qq_39759656/article/details/80701965

都看到這里了,點個贊唄 0.0

❾ 音視頻編解碼 原理

音視頻同步原理[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()

❿ 音視頻壓縮: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幀綁在一起發送

閱讀全文

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

熱點內容
戰雙程序員 瀏覽:479
him觸摸編程軟體 瀏覽:929
植物大戰僵屍存檔怎麼轉移安卓 瀏覽:852
java棧的元素 瀏覽:737
程序員與籃球事件 瀏覽:675
app反編譯不完整 瀏覽:788
電腦上的文件夾怎麼調整 瀏覽:7
伺服器無響應是什麼原因呀 瀏覽:984
wd文檔里的app怎麼製作 瀏覽:513
電腦里的文件夾沒有了一般能恢復嗎 瀏覽:418
哪裡有配加密鑰匙的 瀏覽:210
伺服器開不了機怎麼把數據弄出來 瀏覽:958
gif動態圖片怎麼壓縮 瀏覽:521
黑猴子棒球壓縮文件解壓密碼 瀏覽:631
如何讓app適應不同的手機屏幕大小 瀏覽:10
蘋果手機如何給安卓手機分享軟體 瀏覽:761
蘋果電腦怎麼運行騰訊雲伺服器 瀏覽:59
明日之後沙石堡命令助手 瀏覽:261
蛋糕店用什麼樣的app 瀏覽:877
長安銀行信用卡app怎麼取現 瀏覽:635