国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

這篇具有很好參考價(jià)值的文章主要介紹了【FFmpeg學(xué)習(xí)】H264 視頻碼流分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. H264編碼分層

  • NAL層:(Network Abstraction Layer,視頻數(shù)據(jù)網(wǎng)絡(luò)抽象層): 它的作用是H264只要在網(wǎng)絡(luò)上傳輸,在傳輸?shù)倪^(guò)程每個(gè)包以太網(wǎng)是1500字節(jié),而H264的幀往往會(huì)大于1500字節(jié),所以要進(jìn)行拆包,將一個(gè)幀拆成多個(gè)包進(jìn)行傳輸,所有的拆包或者組包都是通過(guò)NAL層去處理的。
  • VCL層:(Video Coding Layer,視頻數(shù)據(jù)編碼層): 對(duì)視頻原始數(shù)據(jù)進(jìn)行壓縮

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

?我們可以看到視頻幀序列每一幀圖像是由slice構(gòu)成的,每一個(gè)slice是由多個(gè)宏塊構(gòu)成的,在實(shí)際傳輸?shù)倪^(guò)程中,一般一幀圖像就是一個(gè)slice,沒有分那么細(xì)。

NAL單元的結(jié)構(gòu)組成

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

  • ?SODB:(String of Data Bits,原始數(shù)據(jù)比特流):由VCL層產(chǎn)生,數(shù)據(jù)長(zhǎng)度不一定是8的倍數(shù),所以處理起來(lái)比較麻煩
  • RBSP:(Raw Byte Sequence Payload,SODB+trailing bits,編碼后的數(shù)據(jù)流):算法是在SODB最后一位補(bǔ)1,不按字節(jié)對(duì)齊補(bǔ)0,如果補(bǔ)齊0,不知道在哪里結(jié)束,所以補(bǔ)1,如果不夠8位則按位補(bǔ)0
  • EBSP:(Encapsulate Byte Sequence Payload):生成編碼后的數(shù)據(jù)流之后,我們還要在每個(gè)幀之前加一個(gè)起始位,需要開發(fā)者人為添加。起始位一般是十六進(jìn)制的0001。但是在整個(gè)編碼后的數(shù)據(jù)里,可能會(huì)出來(lái)連續(xù)的2個(gè)0x00。那這樣就與起始位產(chǎn)生了沖突.那怎么處理了? H264規(guī)范里說(shuō)明如果處理2個(gè)連續(xù)的0x00,就額外增加一個(gè)0x03 。這樣就能預(yù)防壓縮后的數(shù)據(jù)與起始位產(chǎn)生沖突? EBSP 其實(shí)就是 RBSP 前面增加起始位
  • NALU: (NAL Header(1B)+EBSP).NALU就是在EBSP的基礎(chǔ)上加1B的網(wǎng)絡(luò)頭.
    ?

Slice 宏塊分層:

在上述的VCL層中,切片與宏塊劃分的具體情況如下,對(duì)于slice是由header和data組成,data中由很多的宏塊(MacroBlock)組成,在宏塊中存儲(chǔ)的包括宏塊的類型 mb_type,宏塊的預(yù)測(cè)值mb_pred 和殘差值 codec residual

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

?實(shí)際上H264碼流包含了兩種格式,Annexb和RTP格式的。整體碼流結(jié)構(gòu)為如下形式:
在文件中保存的,每一個(gè)NAL單元前面都有一個(gè)startcode,00開頭的起始碼,這樣由Startcode和NAL單元構(gòu)成的就是Annexb格式。
在網(wǎng)上傳輸,不包含startcode,直接傳輸NAL單元叫RTP碼流。
【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

H264 原始碼流的組成

2、碼流總體結(jié)構(gòu):

h264的功能分為兩層,視頻編碼層(VCL)和網(wǎng)絡(luò)提取層(NAL)。H.264 的編碼視頻序列包括一系列的NAL 單元,每個(gè)NAL 單元包含一個(gè)RBSP。一個(gè)原始的H.264 NALU 單元常由 [StartCode] [NALU Header] [NALU Payload] 三部分組成,其中 Start Code 用于標(biāo)示這是一個(gè)NALU 單元的開始,必須是"00 00 00 01" 或"00 00 01"。
?

NAL 頭部編碼是表示 RBSP 的信息,有 12 種

NAL Header頭部編碼格式:

占一個(gè)字節(jié),8 位,由三部分組成forbidden_bit(1bit),nal_reference_bit(2bits)(優(yōu)先級(jí)),nal_unit_type(5bits)(類型)。

forbidden_bit:禁止位。

nal_reference_bit:當(dāng)前NAL的優(yōu)先級(jí),值越大,該NAL越重要。

nal_unit_type :NAL類型

?如下例子:

IDR幀(關(guān)鍵幀)

  • IDR(Instantaneous Decoding Refresh)即時(shí)解碼刷新。 在編碼解碼中為了方便,將GOP中首個(gè)I幀要和其他I幀區(qū)別開,把第一個(gè)I幀叫IDR,這樣方便控制編碼和解碼流程,所以IDR幀一定是I幀,但I(xiàn)幀不一定是IDR幀;IDR幀的作用是立刻刷新,使錯(cuò)誤不致傳播,從IDR幀開始算新的序列開始編碼。I幀有被跨幀參考的可能,IDR不會(huì)。
  • I幀不用參考任何幀,但是之后的P幀和B幀是有可能參考這個(gè)I幀之前的幀的。IDR就不允許這樣,例如:

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

  • 其核?作?是,是為了解碼的重同步,當(dāng)解碼器解碼到 IDR 圖像時(shí),?即將參考幀隊(duì)列清空,將已解碼的數(shù)據(jù)全部輸出或拋棄,重新查找參數(shù)集,開始?個(gè)新的序列。這樣,如果前?個(gè)序列出現(xiàn)重?錯(cuò)誤,在這?可以獲得重新同步的機(jī)會(huì)。IDR圖像之后的圖像永遠(yuǎn)不會(huì)使?IDR之前的圖像的數(shù)據(jù)來(lái)解碼。
    ?

IDR 關(guān)鍵幀的核?作?是,是為了解碼的重同步,當(dāng)解碼器解碼到 IDR 圖像時(shí),?即將參考幀隊(duì)列清空,將已解碼的數(shù)據(jù)全部輸出或拋棄,重新查找參數(shù)集,開始?個(gè)新的序列。這樣,如果前?個(gè)序列出現(xiàn)重?錯(cuò)誤,在這?可以獲得重新同步的機(jī)會(huì)。IDR圖像之后的圖像永遠(yuǎn)不會(huì)使?IDR之前的圖像的數(shù)據(jù)來(lái)解碼。

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

?如何定義 IBP幀和數(shù)據(jù)傳輸

  1. 分組,也就是將一系列變換不大的圖像歸為一個(gè)組,也就是一個(gè)序列,也可以叫GOP(畫面組);
  2. 定義幀,將每組的圖像幀歸分為I幀、P幀和B幀三種類型;
  3. 預(yù)測(cè)幀, 以I幀做為基礎(chǔ)幀,以I幀預(yù)測(cè)P幀,再由I幀和P幀預(yù)測(cè)B幀;
  4. 數(shù)據(jù)傳輸, 最后將I幀數(shù)據(jù)與預(yù)測(cè)的差值信息進(jìn)行存儲(chǔ)和傳輸?!?span style="color:#fe2c24;">這里是以預(yù)測(cè)的差值作為存儲(chǔ)

從圖中我們需要得到一個(gè)概念,H264碼流是由一個(gè)個(gè)的NAL單元組成,其中SPS、PPS、IDR和SLICE是NAL單元某一類型的數(shù)據(jù)。【由NAL 頭部單元去定義的】

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

SPS 和 PPS

  1. SPS(Sequence Parameter Set:序列參數(shù)集)包含一些通用的參數(shù),比如Profile和Level,比如視頻幀的尺寸,參考幀的最大數(shù)量等,這些參數(shù)對(duì)整個(gè)Video Sequence或者Programme都是通用的。
  2. PPS(Picture Parameter Set:圖像參數(shù)集)包含一些通用的參數(shù),比如熵編碼類型,有效的參考圖像的數(shù)目和初始化參數(shù)等,這些參數(shù)可以應(yīng)用到一個(gè)Video Sequence或者一部分編碼幀。

1. SPS?序列參數(shù)集

H264碼流中SPS PPS詳解 - 知乎

H.264基礎(chǔ)知識(shí)及視頻碼流解析_娃哈哈、的博客-CSDN博客

H264 獲取SPS與PPS(附源碼)_似乎已不再年輕的博客-CSDN博客

2. PPS?圖像參數(shù)集

H264碼流解析_瓜瓜是橘貓的博客-CSDN博客_h264碼流解析

H264碼流結(jié)構(gòu)分析_chenchong_219的博客-CSDN博客_h264碼流

指數(shù)哥倫布編碼格式

指數(shù)哥倫布編碼格式是熵編碼的一種。熵編碼包括的編碼方法有:香農(nóng)-范諾編碼、哈夫曼編碼、算術(shù)編碼、指數(shù)哥倫布編碼、CAVLC、CABAC等。具體實(shí)施起來(lái)就是,對(duì)出現(xiàn)概率較大的符號(hào),取較短的碼長(zhǎng),而對(duì)出現(xiàn)概率較小的符號(hào)取較大的碼長(zhǎng)。這就是熵編碼的中心思想

在計(jì)算機(jī)中,一般數(shù)字的編碼都為二進(jìn)制,但是由于以相等長(zhǎng)度來(lái)記錄不同數(shù)字,因此會(huì)出現(xiàn)很多的冗余信息,如下:

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

如數(shù)字1,原本只需要1個(gè)bit就能表示的數(shù)據(jù),如今需要8個(gè)bit來(lái)表示,那么其余7個(gè)bit就可以看做是冗余數(shù)據(jù),

在網(wǎng)絡(luò)傳輸時(shí),如果以原本等長(zhǎng)的編碼方式來(lái)傳輸數(shù)據(jù),則會(huì)出現(xiàn)很大的冗余量,加重網(wǎng)絡(luò)負(fù)擔(dān),但是如果只用有效字節(jié)來(lái)傳輸上述碼流,則會(huì)是:10110011111111101,這樣根本不能分離出原本的數(shù)據(jù),哥倫布編碼則是作為一種壓縮編碼算法,能很有效地對(duì)原本的數(shù)據(jù)進(jìn)行壓縮,并且能很容易地把編碼后的碼流分離成碼字。

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

編碼器

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

?解碼器

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

?H.264中定義的指數(shù)哥倫布編碼共分四類:

【FFmpeg學(xué)習(xí)】H264 視頻碼流分析

無(wú)符號(hào)指數(shù)哥倫布熵編碼 示例:

1. 編碼過(guò)程:

a、將待編碼的數(shù)加1轉(zhuǎn)換為最小的二進(jìn)制序列(假設(shè)一共M位);
b、此二進(jìn)制序列前面補(bǔ)充M-1個(gè)0;

示例:

對(duì) 4 進(jìn)行無(wú)符號(hào)指數(shù)哥倫布熵編碼
1、將4加1(為5)轉(zhuǎn)換為最小的二進(jìn)制序列即 101 (此是M=3)
2、此二進(jìn)制序列前面補(bǔ)充M-1個(gè)0:即2個(gè)0
3、得出的4的無(wú)符號(hào)指數(shù)哥倫布熵編碼的序列為 00101

2. 解碼過(guò)程:

1、獲取二進(jìn)制序列開頭連續(xù)的N個(gè)0
2、讀取之后的N+1位的值,假設(shè)為X
3、X-1獲取解碼后的值

示例:

如對(duì) 00101進(jìn)行無(wú)符號(hào)指數(shù)哥倫布熵解碼
1、獲取開頭連續(xù)的N個(gè)0, 此時(shí)N = 2
2、再向后讀取N+1位的值,即 101,為5
3、 5 - 1 =4 獲取其解碼后碼值

H264 指數(shù)哥倫布編碼_szfhy的博客-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-430658.html

到了這里,關(guān)于【FFmpeg學(xué)習(xí)】H264 視頻碼流分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ffmpeg學(xué)習(xí)日記604-指令-將視頻格式轉(zhuǎn)為H264格式

    ffmpeg學(xué)習(xí)日記604-指令-將視頻格式轉(zhuǎn)為H264格式 在第四篇中,想要解碼視頻,缺沒有弄清楚怎樣的一個(gè)數(shù)據(jù)流,現(xiàn)在又明晰了一點(diǎn),所謂的h264編解碼,并不是直接將視頻格式,通過(guò)h264編解碼為視頻原始數(shù)據(jù)流,這種說(shuō)法是錯(cuò)誤的,而是應(yīng)該將視頻格式轉(zhuǎn)換為h264的數(shù)據(jù)流,然后

    2024年02月11日
    瀏覽(20)
  • 視頻編碼(H264編碼)

    基本步驟: ?? 1、打開編碼器 ??????? ?2、轉(zhuǎn)換NV12到Y(jié)UV420,這是因?yàn)镕Fmpeg的x264編碼器只支持YUV420 ??????? ?3、準(zhǔn)備編碼數(shù)據(jù)AVFrame ? ? ? ? 創(chuàng)建frame: ?創(chuàng)建AVPacket: AVPacket* pck = av_packet_alloc(); 4、H264編碼 ?? ? ?avcodec_send_frame(#AVCodecContext *avctx#, #const AVFrame *frame#) ? ?

    2024年02月03日
    瀏覽(15)
  • FFmpeg4入門13:h264編碼為mp4

    上一篇將yuv源視頻文件編碼為 *.h264 的由libx264實(shí)現(xiàn)壓縮的文件,將源文件從55M編碼為620KB,但是h264文件只有視頻數(shù)據(jù),而且使用范圍不太廣。那么就需要進(jìn)一步的封裝,在此選用最常用的mp4格式為例。 隨便選一個(gè)mp4格式文件,用FFmpeg4入門4:解析視頻并輸出視頻信息或者ffp

    2023年04月10日
    瀏覽(24)
  • 音視頻——視頻流H264編碼格式

    音視頻——視頻流H264編碼格式

    我們了解了什么是宏快,宏快作為壓縮視頻的最小的一部分,需要被組織,然后在網(wǎng)絡(luò)之間做相互傳輸。 H264更深層次 —》宏塊 太淺了 ? 如果單純的用 宏快 來(lái)發(fā)送數(shù)據(jù)是 雜亂無(wú)章 的,就好像在沒有 集裝箱 出現(xiàn)之前,貨物總是隨意被堆放到船上。 上貨(編碼),下貨是非

    2024年02月15日
    瀏覽(26)
  • 視頻編碼流程 YUV數(shù)據(jù)編碼為H264數(shù)據(jù)

    視頻編碼流程 YUV數(shù)據(jù)編碼為H264數(shù)據(jù)

    視頻編碼時(shí),設(shè)置編碼器上下文參數(shù)有:碼率,寬,高,格式,幀率等 frame設(shè)置:寬,高,格式 然后計(jì)算一幀的數(shù)據(jù):寬 * 高 * 格式占用字節(jié)數(shù) 通常使用av_image_get_buffer_size來(lái)計(jì)算 av_opt_set就是用來(lái)設(shè)置參數(shù)的 preset preset參數(shù)是一個(gè)權(quán)衡編碼速度和壓縮率的參數(shù),編碼速度越慢,壓縮率越高 參數(shù)

    2024年02月13日
    瀏覽(21)
  • FFmpeg解碼H264視頻裸流(直接可用)

    1、寫在前面 此文章主要包含解碼H264視頻流數(shù)據(jù),主要有以下幾點(diǎn): 1、H264視頻幀為Annex B格式,若使用AVCC格式可自行研究; 2、H264視頻裸流,非解碼視頻文件(若有需要我后期可添加這部分代碼); 3、支持輸出RGB24或YUV420格式,其他可自行修改; 4、FFmpeg官網(wǎng)代碼迭代及接口變

    2024年04月25日
    瀏覽(25)
  • golang基于FFmpeg實(shí)現(xiàn)視頻H264編解碼

    golang基于FFmpeg實(shí)現(xiàn)視頻H264編解碼

    FFmpeg 是領(lǐng)先的多媒體框架,能夠解碼、編碼、轉(zhuǎn)碼、混合、解密、流媒體、過(guò)濾和播放人類和機(jī)器創(chuàng)造的幾乎所有東西。它支持最晦澀的古老格式,直到最尖端的格式。無(wú)論它們是由某個(gè)標(biāo)準(zhǔn)委員會(huì)、社區(qū)還是公司設(shè)計(jì)的。它還具有高度的便攜性。 FFmpeg 可以在 Linux、Mac OS

    2024年02月11日
    瀏覽(22)
  • 【解決】螢石云接入視頻報(bào)錯(cuò)視頻編碼類型非H264

    【解決】螢石云接入視頻報(bào)錯(cuò)視頻編碼類型非H264

    說(shuō)在前面 項(xiàng)目視頻監(jiān)控設(shè)備接入了螢石云,部分視頻無(wú)法正常加載,報(bào)錯(cuò)頁(yè)面如下: 原因分析 視頻監(jiān)控視頻編碼目前有H265和H264兩種,螢石云僅支持H264的編碼格式,所以對(duì)于接入的視頻流才會(huì)出現(xiàn)這種錯(cuò)誤。 解決方案 方案一:如果你能接觸到項(xiàng)目部網(wǎng)絡(luò),可以參考螢石云

    2024年02月14日
    瀏覽(79)
  • FFmpeg+SDL實(shí)時(shí)解碼和渲染H264視頻流

    之前實(shí)現(xiàn)了Android手機(jī)攝像頭數(shù)據(jù)的TCP實(shí)時(shí)傳輸,今天接著聊聊,如何在PC端把接收到的H264視頻流實(shí)時(shí)解碼并渲染出來(lái)。這次使用的語(yǔ)言是C++,框架有FFmpeg和SDL2。 解碼部分使用FFmpeg,首先,需要初始化H264解碼器: 然后,使用創(chuàng)建TCP連接到我們的Android端,讀取數(shù)據(jù)包: 再把每

    2024年02月13日
    瀏覽(28)
  • Qt基于FFmpeg解碼本地視頻生成H264文件并播放

    Qt基于FFmpeg解碼本地視頻生成H264文件并播放

    用eseye_u.exe 打開H264文件并播放 本文福利, 免費(fèi)領(lǐng)取C++音視頻學(xué)習(xí)資料包、技術(shù)視頻 ,內(nèi)容包括(音視頻開發(fā),面試題, FFmpeg , webRTC , rtmp , hls , rtsp , ffplay , srs ) ↓↓↓↓↓↓ 見下面↓↓文章底部點(diǎn)擊免費(fèi)領(lǐng)取↓↓ ? 三、核心代碼:? main中創(chuàng)建對(duì)象即可測(cè)試:

    2023年04月17日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包