<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    理解 FFmpeg 中的 pts,dts,time_base

    共 2555字,需瀏覽 6分鐘

     ·

    2024-04-11 02:43

    首先介紹下概念:

    PTS :Presentation Time Stamp。PTS主要用于度量解碼后的視頻幀什么時(shí)候被顯示出來(lái)。

    DTS:Decode Time Stamp。DTS主要是標(biāo)識(shí)讀入內(nèi)存中的bit流在什么時(shí)候開始送入解碼器中進(jìn)行解碼。


    也就是pts反映幀什么時(shí)候開始顯示,dts反映數(shù)據(jù)流什么時(shí)候開始解碼。


    怎么理解這里的“什么時(shí)候”呢?如果有某一幀,假設(shè)它是第10秒開始顯示。那么它的pts是多少呢。是10?還是10s?還是兩者都不是。


    為了回答這個(gè)問題,先引入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è)刻度。但是我不告訴你,這把尺總共是多少厘米的,你就沒辦法計(jì)算每個(gè)刻度是多少厘米,你也就無(wú)法知道物體的長(zhǎng)度。


    pts=20個(gè)刻度
    time_base={1,10} 每一個(gè)刻度是1/10厘米
    所以物體的長(zhǎng)度=pts * time_base=20 *1/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)碼過程,不同的數(shù)據(jù)狀態(tài)對(duì)應(yīng)的時(shí)間基也不一致。

    拿mpegts封裝格式25fps來(lái)說(只說視頻,音頻大致一樣,但也略有不同)。

    非壓縮時(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=n* duration=n *nb_samples。


    -- END --


    進(jìn)技術(shù)交流群,掃碼添加我的微信:Byte-Flow



    獲取相關(guān)資料和源碼


    推薦:

    Android FFmpeg 實(shí)現(xiàn)帶濾鏡的微信小視頻錄制功能

    全網(wǎng)最全的 Android 音視頻和 OpenGL ES 干貨,都在這了

    一文掌握 YUV 圖像的基本處理

    抖音傳送帶特效是怎么實(shí)現(xiàn)的?

    所有你想要的圖片轉(zhuǎn)場(chǎng)效果,都在這了

    面試官:如何利用 Shader 實(shí)現(xiàn) RGBA 到 NV21 圖像格式轉(zhuǎn)換?

    我用 OpenGL ES 給小姐姐做了幾個(gè)抖音濾鏡


    項(xiàng)目疑難問題解答、大廠內(nèi)部推薦、面試指導(dǎo)、簡(jiǎn)歷指導(dǎo)、代碼指導(dǎo)、offer 選擇建議、學(xué)習(xí)路線規(guī)劃,可以點(diǎn)擊找我一對(duì)一解答。

    瀏覽 25
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評(píng)論
    圖片
    表情
    推薦
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    日韩操屄视频 | 老司机你懂的在线观看 | 黄色无码电影 | 天天曰天天干天天射Av | a毛片在线免费观看 |