修复MP4 / M4A文件结构

时间:2012-03-14 08:33:17

标签: tags mp4 m4a

我在标记MP4 / M4A文件时遇到问题。标记操作变为A-OK。好吧,我有一个stco原子的问题,但我解决了这个问题。但是现在,当我播放MP4文件时,mplayer给了我一个错误:

[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'原子)复制到新文件。
  9. 这是文件结构的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
    

1 个答案:

答案 0 :(得分:2)

那是我想的另一个愚蠢的问题。我还有另一个ID-ten-T编程错误。当我处理'stco'原子时,我只读了12个字节(大小,原子名,版本,标志),忘了读'总条目'4字节部分。所以,发生的事情是我最终将'udta'原子的大小添加到'total entries'块中,这导致了FFmpeg错误。通过查看FFmpeg源代码并仔细检查'stco'的结构,我能够解决这个问题。