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

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

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

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

I、P、B 幀

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

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

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

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

通過上述基本可以說明如果有B frame 存在的情況下一個GOP的最后一個frame一定是P.

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

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

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

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

DTS、PTS 的概念

DTS、PTS 的概念如下所述:

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

當視頻流中沒有 B 幀時,通常 DTS 和 PTS 的順序是一致的。但如果有 B 幀時,就回到了我們前面說的問題:解碼順序和播放順序不一致了。

比如一個視頻中,幀的顯示順序是:I B B P,現(xiàn)在我們需要在解碼 B 幀時知道 P 幀中信息,因此這幾幀在視頻流中的順序可能是:I P B B,這時候就體現(xiàn)出每幀都有 DTS 和 PTS 的作用了。DTS 告訴我們該按什么順序解碼這幾幀圖像,PTS 告訴我們該按什么順序顯示這幾幀圖像。順序大概如下:

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

音視頻的同步

上面說了視頻幀、DTS、PTS 相關的概念。我們都知道在一個媒體流中,除了視頻以外,通常還包括音頻。音頻的播放,也有 DTS、PTS 的概念,但是音頻沒有類似視頻中 B 幀,不需要雙向預測,所以音頻幀的 DTS、PTS 順序是一致的。

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

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

PTS和DTS的時間基

PST和DTS的單位是什么?

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

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

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

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

duration和pts單位一樣,duration表示當前幀的持續(xù)時間占多少格。或者理解是兩幀的間隔時間是占多少格。一定要理解單位。
pts:格子數(shù)
av_q2d(st->time_base): 秒/格

計算視頻長度:
time(秒) = st->duration * av_q2d(st->time_base)

ffmpeg內(nèi)部的時間與標準的時間轉換方法:
ffmpeg內(nèi)部的時間戳 = AV_TIME_BASE * time(秒)
AV_TIME_BASE_Q=1/AV_TIME_BASE

av_rescale_q(int64_t a, AVRational bq, AVRational cq)函數(shù)
這個函數(shù)的作用是計算a*bq / cq來把時間戳從一個時間基調(diào)整到另外一個時間基。在進行時間基轉換的時候,應該首先這個函數(shù),因為它可以避免溢出的情況發(fā)生。
函數(shù)表示在bq下的占a個格子,在cq下是多少。

關于音頻pts的計算:
音頻sample_rate:samples per second,即采樣率,表示每秒采集多少采樣點。
比如44100HZ,就是一秒采集44100個sample.
即每個sample的時間是1/44100秒

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

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

相關文章

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

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

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

    Git 教程簡單入門介紹

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

    基于Token的身份驗證的方法

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

    nGrinder性能工具源碼安裝部署過程

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

太和县| 改则县| 财经| 宁城县| 祁连县| 南通市| 若尔盖县| 滁州市| 石渠县| 蒲江县| 千阳县| 宝应县| 天峨县| 聊城市| 镇巴县| 永顺县| 比如县| 怀来县| 府谷县| 靖西县| 岳阳县| 聂拉木县| 广水市| 柘荣县| 石景山区| 时尚| 长春市| 兴义市| 顺平县| 平湖市| 金堂县| 靖远县| 扶绥县| 金阳县| 古蔺县| 旬阳县| 抚顺县| 泊头市| 河北区| 噶尔县| 秭归县|