DVD中AC3转码的同步问题
dwing吧
全部回复
仅看楼主
level 13
dwing 楼主
今天尝试转换一张DVD, 首先使用MakeMKV无损转换成MKV,
然后用x264转换视频部分到video.mkv,
再用dshow2wav|neroaac转换音频部分到audio.m4a,
最后把二者及字幕和章节用mmg合并成最终的mkv.
一切看起来都很正常, 但发现后半部有大约1秒的视频音频不同步.
尝试各种组合最后发现的结果是原版的ac3音频貌似是不连续的,
使用dshow2wav,mplayer导出,mkvextract提取ac3等方法得到的结果都是连续的, 总长比视频少了1秒,
然后试着提取原版和重新封装的ac3轨道的timecodes, 证实确实有差异.
所以在这里求一下如何以原版timecodes来解码输出正常时间的wav.
2011年12月25日 14点12分 1
level 13
dwing 楼主
已查明默认的AC3是32ms一帧, 如果没有解决办法, 我只好手动写个程序根据timecodes来syncwav, 然后再neroaac(aac的帧长和ac3不同).
2011年12月25日 15点12分 2
level 13
dwing 楼主
video有timecode可以理解, 没想到audio也有, 真麻烦...
2011年12月25日 15点12分 3
level 13
dwing 楼主
哦, 也可以把ac3的timecodes转换成aac的, 不过这都是下策, 尽量还是求直接按timecodes解ac3的办法吧.
2011年12月25日 15点12分 4
level 13
dwing 楼主
刚刚写了一个小脚本程序, 实现了"以ac3的timecodes同步aac的timecodes", 确实可以完美地实现同步. 如果没有更好的方案, 就临时这样解决了.
2011年12月25日 16点12分 5
level 9
根据timecodes加空白比较完美吧。
2011年12月26日 01点12分 6
level 13
dwing 楼主
如果dshow2wav支持timecodes就好了, 否则保存并转换一个很大的wav很麻烦, 还不如生成aac的timecodes方便.
2011年12月26日 01点12分 7
level 9
这都解成pcm了,timecode应该对应什么?
2011年12月26日 03点12分 8
level 13
dwing 楼主
dshow2wav可以根据外部timecodes文件自动填充或截取wav, 直接输出到编码器, 这样就没有中间wav文件的生成.
2011年12月26日 03点12分 9
level 9
这个应该不需要,因为得到的PCM数据是带timestamp和duration的,如果发现不连续可以处理。当然当前的版本是无视这些的。
2011年12月26日 03点12分 10
level 13
dwing 楼主
嗯...如果无视timestamp, 确实对某些特殊的视频导出不同步的音频, 建议在timestamp和PCM数据位置的差异大于100ms的时候处理一下.
2011年12月26日 03点12分 11
level 7
为什么不用aac,ac3有什么优势?
2011年12月26日 05点12分 12
level 9
楼上请把一楼看完
2011年12月26日 05点12分 13
level 13
dwing 楼主
说句题外话, 我现在用的x264是JEEB编译版的, 在x264.nl版之上加了很多patch(如FGO)和vf(如yadif), 还有内置的音频编码, 不过不支持HE-AAC和外部编码器, 而且默认的aac编码器还有很严重的内存泄漏, 要手动加参数禁止音频编码.
JEEB编译版: x264.fushizen.eu
2011年12月26日 06点12分 14
level 13
dwing 楼主
另外, 如果视频源有多个音轨, dshow2wav能否加个参数选择导出的音轨ID呢?
希望连同timestamp一起改进一下.
2011年12月27日 05点12分 15
level 9
可以的啊,不过要demuxer支持,要么一次分出所有流,要么和MPC的一样用通用接口切换。
2011年12月27日 08点12分 16
level 13
dwing 楼主
我写了个lua脚本实现了在dshow2wav和neroaac中间根据timecodes的过滤层, 发现超过100ms不同步就做修正, 效果很好, 不过还是期待dshow2wav能实现.
至于多音轨, 暂时只能先用mkvextract或mp4box分离各音轨, 分别转换.
2011年12月29日 06点12分 17
level 13
dwing 楼主
如果有需要这个修正同步的过滤层, 请在下面回帖.
用法是这样的:
dshow2wav input_audio.ac3 | luajit fixwav.lua input_timecodes_v2.txt 6144 | neroaacenc.exe -q 0.15 -he -ignorelength -if - -of output_fix.m4a
其中6144是帧长, 这个暂时要手动输入, 因为输入格式的不同, 帧长也不同, 48kHz双声道的AC3帧是6144字节.
2011年12月29日 06点12分 18
level 9
dshow2wav的第二个参数是选择音轨
dshow2wav input.ac3 1就是选择第二条音轨
2011年12月29日 08点12分 19
level 13
dwing 楼主
测试双音轨的mkv和mp4, 第二个参数貌似没起作用? 只有0能输出, 其它都是空输出.
2011年12月29日 08点12分 20
1 2 尾页