チャンネル切り替えありのAACの可逆カットについて走り書き
音声がADTSではなくLATMだったりADTSだけどTSSplitterが使えなかったりした(使いたくないも含む)時に大晦日のアレとかの中断みたいに5.1ch→2chとかになる場合はどう切るんだって話
前後Cut以外は大人しく再エンコードするのが無難だと思ってますが、ちょっとだけ試したのでメモ。合って無くても保証はしません。っていうかそんなに気にするなら全編5.1chとして再エンコードした方が良いと思うよ
MPEG2-TSあたりに詰め直した方が良いんじゃないのかなあ……(追記)
前提条件として
mp4コンテナに混在したまま食わせるのはデコード的によろしくなさそう→何らかの方法で統一させば良い。
統一させる方法としては、5.1ch部分のみを残すor2ch区間を何らかの方法で5.1chにする。
1.channel-splitterで分割
5.1ch区間の映像をフレーム単位のCutし、aac-channel-splitterまたはlatm-channel-splitterの5.1ch区間とmux
→どうやら再生時間は割と一致するし頭と後ろの誤差は言うほどなさそうだったのでいけそう
別に文字通りぴったりでこれ以上編集することがなければそのままcopy /bでも良いしそっから更に削りたかったらフレーム単位で正しくCutした映像のTrimと分割した音声を正しい組み合わせで紐付けて編集すれば良い
src=("D:\adts_work\src.d2v")
MPEG2Source(src)
aud_src1=("D:\adts_work\112 2_6ch.aac")
aud_src2=("D:\adts_work\112 4_6ch.aac")
aud_src3=("D:\adts_work\112 6_6ch.aac")
Trim(1857,22265).audiodub(aacfaw(aud_src1)).Trim(89,0)+\
Trim(25863,48460).audiodub(aacfaw(aud_src2))+\
Trim(51158,52206).audiodub(aacfaw(aud_src3))
また例としてそのままcopy /bでくっつけた物をffprobeした結果
>Duration: 00:24:29.99, start: 0.000000, bitrate: 382 kb/s
参考情報として従来通りFakeAACWAVでそのまま編集(2fほど片フィールド部分があったがそれは含んだ物として処理) するとAviSynth上では24:30.002。
(※ 多めに切った分で発生しているかもしれないズレの計算→29.97fpsの1fあたりがおよそ33.3ms(30000/1001の逆数)なのでAACのフレーム(21.3ms)に換算すると2-3fずつは多めに切ってると思われるので、84-126msぐらいはズレててもおかしくはない)
FakeAACWAVでそのまま編集した物を戻した物のffprobe
>Duration: 00:24:30.06, start: 0.000000, bitrate: 382 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 380 kb/s (default)
書き忘れたけどchannel-splitter通した後の物は5.1chになっている。けれど、FakeAACWAVで配慮せずそのままぶった切った2つ目は頭に2chのフレームが残ったらしくて2ch判定。
この状態から、aac-channel-splitterでカットすると、頭と最終の1fずつと本編に分割され
>Duration: 00:24:29.91, bitrate: 383 kb/s
になった。
2.全部5.1chのAACとするために2ch区間を5.1chとして再エンコードする
aac-channel-splitterまたはlatm-channel-splitterで分割
出てきた2chのやつだけPCMでデコード(MPEG4-AACだと24Bitなこともあるので要確認 どうせ再エンコするので24Bitなり32Bitでデコードしても良い)
無劣化ならなんでもいいから5.1chになるように水増し(今回はAudacity)
qaac64 –cbr 320 –adts –no-delay
copy /b
でいつも通りのaacとして処理する。–no-delayを利用した場合、冒頭が無音でないとノイズになることがあるらしいが、そもそも冒頭になることはないと思うので……(Priming sampleとかそういう話)
ただ、2ch分詰め込まれていない5.1chは何かがおかしくなりそうな気がする(2022/09/12追記)
3.aactoolを使って無音5.1chに差し替える
境界線が無音区間なのを利用して、ts2aac(up0551.zip)に含まれているaactoolを使って無音5.1chに差し替える。従来通りFakeAACWAVで編集出力したものを通すだけ、かんたん
ズレ的には2と3はどちらも正しく処理出来ていれば同じズレで収まるはず。
手間的には多分3が無難、1も2も悪くなさそうだけど1はavsが場合によっては地獄(っていうか地獄になるような分割なら大人しく通しで再エンコードした方が良いと思う)
2は該当区間再エンコードして戻す作業をまとめにくく面倒だけど、該当部分含めてエンコードする場合は必要だと思う。
自分が普段エンコードするなら3かな
使うかどうかはまた別の話