2012-03-14 55 views
1

我遇到了標記MP4/M4A文件的問題。標記操作變爲A- OK。那麼,我有一個stco原子的問題,但我解決了這個問題。但現在,當我播放MP4文件時,mplayer給我一個錯誤:修復MP4/M4A文件結構

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x29db0a0] wrong sample count 

但是,文件確實播放。

有誰知道我錯過了什麼?這是我爲了將我的標記原子添加到MP4文件而做的。我有一種感覺,我不更新某個原子,就像stco原子需要用新的絕對文件位置參考進行更新一樣。

  1. 閱讀到「moov」邏輯原子
  2. 更新「MOOV的規模,包括我的標籤的大小(它是不存在之前的操作)
  3. 寫出所有資料(包括更新'moov'大小)到新文件
  4. 讀入'stco'原子和4個字節後面(不需要更改的版本和標誌信息)。
  5. 寫出'stco'頭文件到新文件
  6. 讀入,處理和讀出每個4字節的絕對文件位置,將它們移動到我要添加的udta原子的大小。將每個更新的4字節位置寫入新文件。
  7. 寫出'udta'原子(它直接跟隨'stco')新文件。
  8. 將輸入文件的其餘部分('mdat'atom)複製到新文件中。

這裏的文件結構的AtomicParsley轉儲:

Atom ftyp @ 0 of size: 36, ends @ 36 
Atom moov @ 36 of size: 61886, ends @ 61922 
    Atom mvhd @ 44 of size: 108, ends @ 152 
    Atom iods @ 152 of size: 33, ends @ 185 
    Atom trak @ 185 of size: 32935, ends @ 33120 
     Atom tkhd @ 193 of size: 92, ends @ 285 
     Atom mdia @ 285 of size: 32835, ends @ 33120 
      Atom mdhd @ 293 of size: 32, ends @ 325 
      Atom hdlr @ 325 of size: 37, ends @ 362 
      Atom minf @ 362 of size: 32758, ends @ 33120 
       Atom smhd @ 370 of size: 16, ends @ 386 
       Atom dinf @ 386 of size: 36, ends @ 422 
        Atom dref @ 394 of size: 28, ends @ 422 
       Atom stbl @ 422 of size: 32698, ends @ 33120 
        Atom stts @ 430 of size: 24, ends @ 454 
        Atom stsd @ 454 of size: 106, ends @ 560 
         Atom mp4a @ 470 of size: 90, ends @ 560 
          Atom esds @ 506 of size: 54, ends @ 560 
        Atom stsz @ 560 of size: 29548, ends @ 30108 
        Atom stsc @ 30108 of size: 40, ends @ 30148 
        Atom stco @ 30148 of size: 2972, ends @ 33120 
    Atom udta @ 33120 of size: 28802, ends @ 61922 
     Atom meta @ 33128 of size: 28794, ends @ 61922 
      Atom hdlr @ 33140 of size: 34, ends @ 33174 
      Atom ilst @ 33174 of size: 28748, ends @ 61922 
       Atom ©ART @ 33182 of size: 33, ends @ 33215 
        Atom data @ 33190 of size: 25, ends @ 33215 
       Atom ©nam @ 33215 of size: 77, ends @ 33292 
        Atom data @ 33223 of size: 69, ends @ 33292 
       Atom ©alb @ 33292 of size: 34, ends @ 33326 
        Atom data @ 33300 of size: 26, ends @ 33326 
       Atom covr @ 33326 of size: 28596, ends @ 61922 
        Atom data @ 33334 of size: 28588, ends @ 61922 
Atom mdat @ 61922 of size: 2742564, ends @ 2804486 
+0

在FFmpeg代碼中看到提及之後,我檢查了stsz原子,並且該原子中的計數是正確的。 – 2012-03-14 09:30:40

回答

2

黨,另一個愚蠢的問題,我猜。我還是另一個ID-ten-T編程錯誤。當我處理'stco'原子時,我只能讀取12個字節(大小,原子名稱,版本,標誌),並忘記讀入'總數'4字節部分。所以,發生了什麼事情後,我最終將'udta'原子的大小添加到'total entries'塊,導致FFmpeg錯誤。我能夠通過查看FFmpeg源代碼並仔細檢查'stco'的結構來了解這一點。