我在标记 MP4/M4A 文件时遇到问题。标记操作进行 A-OK。好吧,我对 stco atom 有疑问,但我解决了这个问题。但是现在,当我播放 MP4 文件时,mplayer 给我一个错误:
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x29db0a0] wrong sample count
但是,该文件确实可以播放。
有人知道我错过了什么吗?这是我为了将我的标记原子添加到 MP4 文件所做的工作。我有一种感觉,我没有更新某个原子,就像需要使用新的绝对文件位置引用更新的 stco 原子一样。
- 读到“moov”原子
- 更新“moov”的大小以包含我的标签的大小(在操作之前不存在)
- 将所有数据(包括更新的“moov”大小)写入新文件
- 最多读入“stco”原子和后面的 4 个字节(不需要更改的版本和标志信息)。
- 将“stco”标头写入新文件
- 读入、处理和读出每个 4 字节的绝对文件位置,以将它们向上移动我要添加的 udta atom 的大小。将每个更新的 4 字节位置写入新文件。
- 写出新文件的“udta”原子(直接跟在“stco”之后)。
- 将输入文件的剩余部分(“mdat”原子)复制到新文件中。
这是文件结构的 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