<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          解析 MP4 文件讀取信息

          共 1771字,需瀏覽 4分鐘

           ·

          2022-06-19 10:41

          在之前文章中已經(jīng)介紹過了 MP4 標(biāo)準(zhǔn)的來源以及它的格式定義,基本上就是由一個(gè)個(gè) Box 組成的,大致的結(jié)構(gòu)如下:

          ftyp
          moov
              mvhd
              trak
                  tkhd
                  mdia
              trak
                  tkhd
                  mdia
          mdat

          之前文章:

          重學(xué)音視頻?認(rèn)識(shí) MP4 視頻(上)

          重學(xué)音視頻?認(rèn)識(shí) MP4 視頻(下)

          接下來我們就要去手動(dòng)解析 MP4 文件,注意這可不是用 FFmpeg 來解封裝,而是從 MP4 文件中一個(gè)一個(gè)字節(jié)讀取信息并解析它的含義獲得想要的內(nèi)容。

          平常一看到后綴是 .mp4 的文件,腦海里一想到的就是視頻,但其實(shí)不管后綴如何,它也還是一個(gè)二進(jìn)制文件,可以按照二進(jìn)制的方式進(jìn)行讀取和寫入。

          解析 MP4 文件獲取信息

          舉個(gè)例子,在 Mac 上用 010 Editor 軟件去查看一個(gè) MP4 文件,以 16 進(jìn)制顯示,效果如下:

          從圖中箭頭指示處可以看到 ftypmvhd 兩個(gè) Box 類型,另外也還有 moovtkhd 這些 Box 類型。

          之所以能夠顯示出 Box 類型的字符串,是因?yàn)榘咽M(jìn)制數(shù)據(jù)轉(zhuǎn)換成 ASCII 碼了,比如 61 對(duì)應(yīng)就是字母 a ,這應(yīng)該在計(jì)算機(jī)基礎(chǔ)書中都有講過的。

          mvhd Box中存儲(chǔ)著視頻文件的時(shí)長信息,想要獲取到這個(gè)信息,直接從 Box 中讀取就好,至于為什么會(huì)這樣,見下圖:

          上圖展示了 mvhd Box 的數(shù)據(jù)結(jié)構(gòu),它繼承自 FullBox,在讀取時(shí)先讀取 FullBox 的字段,然后在讀取 mvhd Box 自己的(取 version == 0 時(shí)的數(shù)據(jù)結(jié)構(gòu)排布)。

          關(guān)于 mvhd box 和 full box 的數(shù)據(jù)結(jié)構(gòu)文檔以及 MP4 中所有 Box 的類型資料,已經(jīng)在知識(shí)星球中給出了,可以加入星球在資料中找到,文末有優(yōu)惠券。

          FullBox 的數(shù)據(jù)結(jié)構(gòu)如上所示,由字節(jié)位數(shù)可以算出,在 box type 之后偏移 12 字節(jié)可以得到 timescale 字段內(nèi)容,偏移 16 字節(jié)可以得到 duration 字段內(nèi)容。

          其中 timescale 為 0x000003E8,對(duì)應(yīng)十進(jìn)制數(shù)據(jù) 1000 。

          duration 為 0x000086E6,對(duì)應(yīng)十進(jìn)制數(shù)據(jù) 34534。

          用 duration 除以 timescale 就是視頻的時(shí)長了,十六進(jìn)制相除后的結(jié)果是 0x22,轉(zhuǎn)換成十進(jìn)制就是 34,和用十進(jìn)制數(shù)據(jù)相除得到的 34.534 基本一致了(時(shí)長單位是秒)。

          以上只是個(gè)簡單例子,說明完全可以去手動(dòng)解析 MP4 文件獲取它的格式信息。

          而且在這個(gè)層面上還有一些獨(dú)特的用法:比如我們要想提取視頻中的某個(gè) Box 信息,或者想要填充自定義的 Box 格式,攜帶一些私有數(shù)據(jù),在播放時(shí)再把它解析出來做處理。

          在接下來的文章,我們就會(huì)去實(shí)踐手動(dòng)解析 MP4 文件,逐一拆解每個(gè) Box 格式,發(fā)掘其背后的另一種用法,加強(qiáng)對(duì)音視頻的處理能力。

          最后歡迎大家加入 音視頻開發(fā)進(jìn)階 知識(shí)星球 ,這里有知識(shí)干貨、編程答疑、開發(fā)教程,還有很多精彩分享。


          更多內(nèi)容可以在星球菜單中找到,隨著時(shí)間推移,干貨也會(huì)越來越多?。?!


          給出 10元 優(yōu)惠券,漲價(jià)在即,目前還是白菜價(jià),基本上提幾個(gè)問題就回本,投資自己就是最好的投資?。?!


          加我微信 ezglumes ,拉你進(jìn)技術(shù)交流群

          推薦閱讀:

          音視頻開發(fā)工作經(jīng)驗(yàn)分享 || 視頻版

          OpenGL ES 學(xué)習(xí)資源分享

          開通專輯 | 細(xì)數(shù)那些年寫過的技術(shù)文章專輯

          Android NDK 免費(fèi)視頻在線學(xué)習(xí)!?。?/a>

          你想要的音視頻開發(fā)資料庫來了

          推薦幾個(gè)堪稱教科書級(jí)別的 Android 音視頻入門項(xiàng)目

          覺得不錯(cuò),點(diǎn)個(gè)在看唄~

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  xxxxx在线 | 苍井空电影一区二区三区 | 18禁网站色 | 99国产视频| 大吊一区二区三区 |