最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談音視頻 pts dts基本概念及理解

 更新時(shí)間:2022年08月04日 10:24:59   作者:鄭文博Coding  
本文主要介紹了音視頻 pts dts基本概念及理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

視頻的播放過(guò)程可以簡(jiǎn)單理解為一幀一幀的畫(huà)面按照時(shí)間順序呈現(xiàn)出來(lái)的過(guò)程,就像在一個(gè)本子的每一頁(yè)畫(huà)上畫(huà),然后快速翻動(dòng)的感覺(jué)。
但是在實(shí)際應(yīng)用中,并不是每一幀都是完整的畫(huà)面,因?yàn)槿绻恳粠?huà)面都是完整的圖片,那么一個(gè)視頻的體積就會(huì)很大,這樣對(duì)于網(wǎng)絡(luò)傳輸或者視頻數(shù)據(jù)存儲(chǔ)來(lái)說(shuō)成本太高,所以通常會(huì)對(duì)視頻流中的一部分畫(huà)面進(jìn)行壓縮(編碼)處理。由于壓縮處理的方式不同,視頻中的畫(huà)面幀就分為了不同的類別,其中包括:I 幀、P 幀、B 幀。

I、P、B 幀

I 幀、P 幀、B 幀的區(qū)別在于:

I 幀(Intra coded frames):I 幀圖像采用幀內(nèi)編碼方式,即只利用了單幀圖像內(nèi)的空間相關(guān)性,而沒(méi)有利用時(shí)間相關(guān)性。I 幀使用幀內(nèi)壓縮,不使用運(yùn)動(dòng)補(bǔ)償,由于 I 幀不依賴其它幀,所以是隨機(jī)存取的入點(diǎn),同時(shí)是解碼的基準(zhǔn)幀。I 幀主要用于接收機(jī)的初始化和信道的獲取,以及節(jié)目的切換和插入,I 幀圖像的壓縮倍數(shù)相對(duì)較低。I 幀圖像是周期性出現(xiàn)在圖像序列中的,出現(xiàn)頻率可由編碼器選擇。
P 幀(Predicted frames):P 幀和 B 幀圖像采用幀間編碼方式,即同時(shí)利用了空間和時(shí)間上的相關(guān)性。P 幀圖像只采用前向時(shí)間預(yù)測(cè),可以提高壓縮效率和圖像質(zhì)量。P 幀圖像中可以包含幀內(nèi)編碼的部分,即 P 幀中的每一個(gè)宏塊可以是前向預(yù)測(cè),也可以是幀內(nèi)編碼。
B 幀(Bi-directional predicted frames):B 幀圖像采用雙向時(shí)間預(yù)測(cè),可以大大提高壓縮倍數(shù)。值得注意的是,由于 B 幀圖像采用了未來(lái)幀作為參考,因此 MPEG-2 編碼碼流中圖像幀的傳輸順序和顯示順序是不同的。
也就是說(shuō),一個(gè) I 幀可以不依賴其他幀就解碼出一幅完整的圖像,而 P 幀、B 幀不行。P 幀需要依賴視頻流中排在它前面的幀才能解碼出圖像。B 幀則需要依賴視頻流中排在它前面或后面的幀才能解碼出圖像。

這就帶來(lái)一個(gè)問(wèn)題:在視頻流中,先到來(lái)的 B 幀無(wú)法立即解碼,需要等待它依賴的后面的 I、P 幀先解碼完成,這樣一來(lái)播放時(shí)間與解碼時(shí)間不一致了,順序打亂了,那這些幀該如何播放呢?這時(shí)就需要我們來(lái)了解另外兩個(gè)概念:DTS 和 PTS(詳見(jiàn)下邊說(shuō)明)。

兩個(gè)I frame之間形成一個(gè)GOP,在x264中同時(shí)可以通過(guò)參數(shù)來(lái)設(shè)定bf的大小,即:I 和p或者兩個(gè)P之間B的數(shù)量。

通過(guò)上述基本可以說(shuō)明如果有B frame 存在的情況下一個(gè)GOP的最后一個(gè)frame一定是P.

看x264代碼,感覺(jué)GOP 就是IDR幀到另一個(gè)IDR幀之間 就是一個(gè)GOP.在視頻編碼序列中,GOP即Group of picture(圖像組),指兩個(gè)I幀之間的距離,Reference(參考周期)指兩個(gè)P幀之間的距離(如下圖)。一個(gè)I幀所占用的字節(jié)數(shù)大于一個(gè)P幀,一個(gè)P幀所占用的字節(jié)數(shù)大于一個(gè)B幀(如下圖所示)。

所以在碼率不變的前提下,GOP值越大,P、B幀的數(shù)量會(huì)越多,平均每個(gè)I、P、B幀所占用的字節(jié)數(shù)就越多,也就更容易獲取較好的圖像質(zhì)量;Reference越大,B幀的數(shù)量越多,同理也更容易獲得較好的圖像質(zhì)量。

需要說(shuō)明的是,通過(guò)提高GOP值來(lái)提高圖像質(zhì)量是有限度的,在遇到場(chǎng)景切換的情況時(shí),H.264編碼器會(huì)自動(dòng)強(qiáng)制插入一個(gè)I幀,此時(shí)實(shí)際的GOP值被縮短了。另一方面,在一個(gè)GOP中,P、B幀是由I幀預(yù)測(cè)得到的,當(dāng)I幀的圖像質(zhì)量比較差時(shí),會(huì)影響到一個(gè)GOP中后續(xù)P、B幀的圖像質(zhì)量,直到下一個(gè)GOP開(kāi)始才有可能得以恢復(fù),所以GOP值也不宜設(shè)置過(guò)大。

同時(shí),由于P、B幀的復(fù)雜度大于I幀,所以過(guò)多的P、B幀會(huì)影響編碼效率,使編碼效率降低。另外,過(guò)長(zhǎng)的GOP還會(huì)影響Seek操作的響應(yīng)速度,由于P、B幀是由前面的I或P幀預(yù)測(cè)得到的,所以Seek操作需要直接定位,解碼某一個(gè)P或B幀時(shí),需要先解碼得到本GOP內(nèi)的I幀及之前的N個(gè)預(yù)測(cè)幀才可以,GOP值越長(zhǎng),需要解碼的預(yù)測(cè)幀就越多,seek響應(yīng)的時(shí)間也越長(zhǎng)。

DTS、PTS 的概念

DTS、PTS 的概念如下所述:

DTS(Decoding Time Stamp):即解碼時(shí)間戳,這個(gè)時(shí)間戳的意義在于告訴播放器該在什么時(shí)候解碼這一幀的數(shù)據(jù)。
PTS(Presentation Time Stamp):即顯示時(shí)間戳,這個(gè)時(shí)間戳用來(lái)告訴播放器該在什么時(shí)候顯示這一幀的數(shù)據(jù)。
需要注意的是:雖然 DTS、PTS 是用于指導(dǎo)播放端的行為,但它們是在編碼的時(shí)候由編碼器生成的。

當(dāng)視頻流中沒(méi)有 B 幀時(shí),通常 DTS 和 PTS 的順序是一致的。但如果有 B 幀時(shí),就回到了我們前面說(shuō)的問(wèn)題:解碼順序和播放順序不一致了。

比如一個(gè)視頻中,幀的顯示順序是:I B B P,現(xiàn)在我們需要在解碼 B 幀時(shí)知道 P 幀中信息,因此這幾幀在視頻流中的順序可能是:I P B B,這時(shí)候就體現(xiàn)出每幀都有 DTS 和 PTS 的作用了。DTS 告訴我們?cè)摪词裁错樞蚪獯a這幾幀圖像,PTS 告訴我們?cè)摪词裁错樞蝻@示這幾幀圖像。順序大概如下:

PTS:   480   640  560  520  600  800  720  680  760  960 ...
DTS:   400   440  480  520  560  600  640  680  720  760 ...
Stream: I     P    B    B    B    P    B    B    B    P  ...
播放序: 1     5    3    2    4    9    7    6    8   10  ...               
PTS >= DTS

音視頻的同步

上面說(shuō)了視頻幀、DTS、PTS 相關(guān)的概念。我們都知道在一個(gè)媒體流中,除了視頻以外,通常還包括音頻。音頻的播放,也有 DTS、PTS 的概念,但是音頻沒(méi)有類似視頻中 B 幀,不需要雙向預(yù)測(cè),所以音頻幀的 DTS、PTS 順序是一致的。

音頻視頻混合在一起播放,就呈現(xiàn)了我們常??吹降膹V義的視頻。在音視頻一起播放的時(shí)候,我們通常需要面臨一個(gè)問(wèn)題:怎么去同步它們,以免出現(xiàn)畫(huà)不對(duì)聲的情況。

要實(shí)現(xiàn)音視頻同步,通常需要選擇一個(gè)參考時(shí)鐘,參考時(shí)鐘上的時(shí)間是線性遞增的,編碼音視頻流時(shí)依據(jù)參考時(shí)鐘上的時(shí)間給每幀數(shù)據(jù)打上時(shí)間戳。在播放時(shí),讀取數(shù)據(jù)幀上的時(shí)間戳,同時(shí)參考當(dāng)前參考時(shí)鐘上的時(shí)間來(lái)安排播放。這里的說(shuō)的時(shí)間戳就是我們前面說(shuō)的 PTS。實(shí)踐中,我們可以選擇:同步視頻到音頻、同步音頻到視頻、同步音頻和視頻到外部時(shí)鐘。

PTS和DTS的時(shí)間基

PST和DTS的單位是什么?

為了回答這個(gè)問(wèn)題,先引入FFmpeg中時(shí)間基的概念,也就是time_base。它也是用來(lái)度量時(shí)間的。
如果把1秒分為25等份,你可以理解就是一把尺,那么每一格表示的就是1/25秒。此時(shí)的time_base={1,25}
如果你是把1秒分成90000份,每一個(gè)刻度就是1/90000秒,此時(shí)的time_base={1,90000}。
所謂時(shí)間基表示的就是每個(gè)刻度是多少秒
pts的值就是占多少個(gè)時(shí)間刻度(占多少個(gè)格子)。它的單位不是秒,而是時(shí)間刻度。只有pts加上time_base兩者同時(shí)在一起,才能表達(dá)出時(shí)間是多少。
好比我只告訴你,某物體的長(zhǎng)度占某一把尺上的20個(gè)刻度。但是我不告訴你,這把尺總共是多少厘米的,你就沒(méi)辦法計(jì)算每個(gè)刻度是多少厘米,你也就無(wú)法知道物體的長(zhǎng)度。
pts=20個(gè)刻度
time_base={1,10} 每一個(gè)刻度是1/10厘米
所以物體的長(zhǎng)度=ptstime_base=201/10 厘米

在ffmpeg中。av_q2d(time_base)=每個(gè)刻度是多少秒
此時(shí)你應(yīng)該不難理解 pts*av_q2d(time_base)才是幀的顯示時(shí)間戳。

下面理解時(shí)間基的轉(zhuǎn)換,為什么要有時(shí)間基轉(zhuǎn)換。
首先,不同的封裝格式,timebase是不一樣的。另外,整個(gè)轉(zhuǎn)碼過(guò)程,不同的數(shù)據(jù)狀態(tài)對(duì)應(yīng)的時(shí)間基也不一致。拿mpegts封裝格式25fps來(lái)說(shuō)(只說(shuō)視頻,音頻大致一樣,但也略有不同)。非壓縮時(shí)候的數(shù)據(jù)(即YUV或者其它),在ffmpeg中對(duì)應(yīng)的結(jié)構(gòu)體為AVFrame,它的時(shí)間基為AVCodecContext 的time_base ,AVRational{1,25}。
壓縮后的數(shù)據(jù)(對(duì)應(yīng)的結(jié)構(gòu)體為AVPacket)對(duì)應(yīng)的時(shí)間基為AVStream的time_base,AVRational{1,90000}。
因?yàn)閿?shù)據(jù)狀態(tài)不同,時(shí)間基不一樣,所以我們必須轉(zhuǎn)換,在1/25時(shí)間刻度下占10格,在1/90000下是占多少格。這就是pts的轉(zhuǎn)換。

根據(jù)pts來(lái)計(jì)算一楨在整個(gè)視頻中的時(shí)間位置:
timestamp(秒) = pts * av_q2d(st->time_base)

duration和pts單位一樣,duration表示當(dāng)前幀的持續(xù)時(shí)間占多少格?;蛘呃斫馐莾蓭拈g隔時(shí)間是占多少格。一定要理解單位。
pts:格子數(shù)
av_q2d(st->time_base): 秒/格

計(jì)算視頻長(zhǎng)度:
time(秒) = st->duration * av_q2d(st->time_base)

ffmpeg內(nèi)部的時(shí)間與標(biāo)準(zhǔn)的時(shí)間轉(zhuǎn)換方法:
ffmpeg內(nèi)部的時(shí)間戳 = AV_TIME_BASE * time(秒)
AV_TIME_BASE_Q=1/AV_TIME_BASE

av_rescale_q(int64_t a, AVRational bq, AVRational cq)函數(shù)
這個(gè)函數(shù)的作用是計(jì)算a*bq / cq來(lái)把時(shí)間戳從一個(gè)時(shí)間基調(diào)整到另外一個(gè)時(shí)間基。在進(jìn)行時(shí)間基轉(zhuǎn)換的時(shí)候,應(yīng)該首先這個(gè)函數(shù),因?yàn)樗梢员苊庖绯龅那闆r發(fā)生。
函數(shù)表示在bq下的占a個(gè)格子,在cq下是多少。

關(guān)于音頻pts的計(jì)算:
音頻sample_rate:samples per second,即采樣率,表示每秒采集多少采樣點(diǎn)。
比如44100HZ,就是一秒采集44100個(gè)sample.
即每個(gè)sample的時(shí)間是1/44100秒

一個(gè)音頻幀的AVFrame有nb_samples個(gè)sample,所以一個(gè)AVFrame耗時(shí)是nb_samples*(1/44100)秒
即標(biāo)準(zhǔn)時(shí)間下duration_s=nb_samples*(1/44100)秒,
轉(zhuǎn)換成AVStream時(shí)間基下
duration=duration_s / av_q2d(st->time_base)
基于st->time_base的num值一般等于采樣率,所以duration=nb_samples.
pts=nduration=nnb_samples

到此這篇關(guān)于淺談音視頻 pts dts基本概念及理解的文章就介紹到這了,更多相關(guān)音視頻 pts dts內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • kettle?入門使用教程(最新版)

    kettle?入門使用教程(最新版)

    Kettle是一款國(guó)外開(kāi)源的ETL工具,純java編寫,可以在Window、Linux、Unix上運(yùn)行,數(shù)據(jù)抽取高效穩(wěn)定,本文以7.0.0.0-25版本為例給大家詳細(xì)講解下載安裝入門級(jí)教程,感興趣的朋友一起看看吧
    2022-11-11
  • Git 教程簡(jiǎn)單入門介紹

    Git 教程簡(jiǎn)單入門介紹

    本文主要介紹Git 教程簡(jiǎn)單入門的東西,這里整理了Git 的基礎(chǔ)資料和簡(jiǎn)單命令,有需要的小伙伴可以參考下
    2016-09-09
  • 基于Token的身份驗(yàn)證的方法

    基于Token的身份驗(yàn)證的方法

    這篇文章主要介紹了基于Token的身份驗(yàn)證的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • nGrinder性能工具源碼安裝部署過(guò)程

    nGrinder性能工具源碼安裝部署過(guò)程

    nGrinder是NHN公司用Java語(yǔ)言開(kāi)發(fā)的一款的基于Grinder開(kāi)發(fā)的開(kāi)源B/S Web性能測(cè)試平臺(tái),具有友好簡(jiǎn)潔的用戶界面和分布式測(cè)試功能,本文給大家分享nGrinder性能工具源碼安裝部署過(guò)程,一起看看吧
    2021-05-05
  • 一看就懂的IDEA編輯器 .http教程詳解

    一看就懂的IDEA編輯器 .http教程詳解

    這篇文章主要介紹了一看就懂的IDEA編輯器 .http教程詳解,本文以PHPStorm的ide作為例子的講解,需要的朋友可以參考下
    2020-11-11
  • Typora+PicGo+GitHub實(shí)現(xiàn)md自帶圖床效果

    Typora+PicGo+GitHub實(shí)現(xiàn)md自帶圖床效果

    這篇文章主要介紹了Typora+PicGo+GitHub實(shí)現(xiàn)md自帶圖床效果,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 網(wǎng)址URL的大小寫敏感嗎,有什么區(qū)別?

    網(wǎng)址URL的大小寫敏感嗎,有什么區(qū)別?

    在?Web?開(kāi)發(fā)中,網(wǎng)址URL?的大小寫問(wèn)題可能引發(fā)意想不到的行為,本文將從技術(shù)規(guī)范、服務(wù)器配置、瀏覽器行為等多個(gè)維度,系統(tǒng)解析?URL?各組件的大小寫敏感性,并提供實(shí)踐建議,可有效避免因?URL?大小寫不一致引發(fā)的搜索引擎優(yōu)化問(wèn)題、鏈接失效及用戶體驗(yàn)下降
    2025-04-04
  • 到初創(chuàng)公司工作的五個(gè)理由

    到初創(chuàng)公司工作的五個(gè)理由

    這篇文章主要介紹了到初創(chuàng)公司工作的五個(gè)理由,在職業(yè)選擇上并不來(lái)一定要去大公司,去初創(chuàng)公司工作一次會(huì)讓你有更多的收獲,需要的朋友可以參考下
    2014-09-09
  • curl和wget檢測(cè)網(wǎng)頁(yè)狀態(tài)的區(qū)別

    curl和wget檢測(cè)網(wǎng)頁(yè)狀態(tài)的區(qū)別

    curl和Wget在linux日常使用中非常常見(jiàn),它們都可以向服務(wù)器發(fā)出請(qǐng)求,curl和Wget的一個(gè)最明顯的區(qū)別是:默認(rèn)情況下Wget將查詢的網(wǎng)頁(yè)保存到系統(tǒng),而?curl將其顯示在終端輸出中但不保存它,curl的使用率比Wget多得多
    2025-04-04
  • 一張圖告訴你計(jì)算機(jī)編程語(yǔ)言的發(fā)展歷史

    一張圖告訴你計(jì)算機(jī)編程語(yǔ)言的發(fā)展歷史

    這篇文章主要介紹了一張圖告訴你計(jì)算機(jī)編程語(yǔ)言的發(fā)展歷史,也可看作是計(jì)算機(jī)的發(fā)展歷史大事記,需要的朋友可以參考下
    2015-07-07

最新評(píng)論

榆中县| 宿州市| 秭归县| 夹江县| 上虞市| 永年县| 增城市| 荔波县| 绥中县| 定兴县| 华坪县| 东乡县| 凌云县| 雅江县| 盐边县| 伽师县| 吴江市| 喀喇沁旗| 论坛| 南京市| 天气| 尉犁县| 田东县| 滕州市| 和林格尔县| 乡宁县| 海丰县| 天全县| 吕梁市| 清镇市| 南丰县| 曲靖市| 二连浩特市| 呼伦贝尔市| 兰州市| 宿松县| 武功县| 天峨县| 茶陵县| 云龙县| 洮南市|