我曾拿一段wav格式的loop素材做了个试验:
源是16位立体声0xB5E(2910)采样的wav文件
然后删去头4个字节(一个采样)再将wav头的长度及data段后的长度减去4另存为一份供对比
参数用neroaacenc -q 0.12 -hev2 -if in.wav -of out.mp4
(Nero AAC codec / 1.5.4.0,因为hev2延迟最明显,故用hev2做测试)
对比两者转出的mp4,忽略头部的修改日期信息和数据段,两者仅在esds、stsz,还有itunsmpb字段的信息出现不同
考虑到AAC数据已完全不同,长度也不一样,故stsz产生的不同可以忽略
关键决定长度和偏移的只有esds和itunsmpb字段了
用neroaactag -list-meta out.mp4 显示itunsmpb字段
原始的wav转的mp4: itunsmpb = 00000000 00000AF8 000001A9 0000000000000B5F (后面都是00了,就不列出来)
减短的wav转的mp4: itunsmpb = 00000000 00000AF8 000001AA 0000000000000B5E
可见itunsmpb的第4项记录了原始长度信息
esds段(有03,04,05号,但不同的只有04):
原始:04 80 80 80 19 40 15 00 00 DC 00 00 15 78 00 00 4D 08
减少:04 80 80 80 19 40 15 00 00 DC 00 00 15 D8 00 00 4E 60
貌似没有什么明显的规律?
再分别用neroaacdec和faad2(用源代码自带的aacDECdrop例子)解码原始长度的mp4
nero.wav:长度准确,回放无缝loop
faad.wav:总采样数0x2800(而itunsmpb的总和AF8+1A9+B5F=1800 !),而真正无缝的第一个采样是第0xDF0(AF8+1A9=0xCA1 !)个采样
我实在不知道要如何才能将FAAD2的解码数据和这些信息对应,算出正确的第一个采样的偏移来……