LATMの可逆カットの話
最近ちらほら見るようになってきたLATMも可逆カット編集したくないですか!?
というわけであれこれ試したのでメモ書き。規格書を読んだ方が確実
そのままぶった切る
まず、LATMとは、Low-overhead Audio Transport Multiplexといい、従来のADTSより多彩なAACに対応した上でオーバーヘッドが少なくなった、音声伝送規格になっています。
詳しく知りたい人は、こんなところの日記なぞ読まずに適切な規格書(ISO/IEC 14496-3)を読むことを強く推奨しておくので適当な説明程度に留めておきます。そういえば国内での利用例ではARIB STD-B32が有名ですね。
実はこのLATM,Multiplexと言い切ってるだけあって(Transport Streamみたいな言葉もありませんね)ADTSとは違い多重化のみで同期層を持っていません。そのため同期手段を持たないMPEG2-TSなりMMT-TLVなどでは同期することが出来ません。このLATMに同期手段を実装するものがLOAS(Low Overhead Audio Stream)というっぽいです。

LOASの実装自体はシンプルで、ヘッダーはSyncWordとLOAS 1フレームのファイルサイズ情報だけとなっており、その後LATMその物をPayload部に含んでいます。そのため、LOAS単位で切り貼りすることによって前後カットを実現することが出来ます。
なので、最初にこういうのをつくりました。
tana3n/loas-tools: some tools for LATM/LOAS File
これでとりあえず無劣化Cutは実現できるようになりました。
FakeAACWAVを参考に等間隔にWAVEにLOASのフレームを配置してカット編集を行い戻し作業をするだけです。
が、本家と違って補正部分を真面目に作り込んでないので前後Cut程度の運用しか想定していません。A-B点編集を無限に繰り返した場合は編集点毎に最大21ms(1フレーム1024サンプルなので1024/48000Hz=21ms)音声が縮んだりズレたりします。が、多分前後Cutぐらいなら分からないと思います。こんなのを見た後にAccurateRipの30サンプル問題見ても些細な問題にしか見えないですね(ぐるぐる目)後述しますが別にこれ使わなくても良い事が多い。
22.2chだとどっかの規格書曰く1920kbpsまで許されるぽくて16Bit2ch48KHzのPCMの1536kbpsだと溢れてしまうので直したついでにFakeAACWAVでいう1/2モード同等の機能がつきましたこれで5.1ch以下の時はそんなに食わなくて済みますね(ぐるぐる目)
22.2chは一応ffmpegがデコード出来るようになったのでついでにダウンミックス(ぱっと見AACのビットストリームみてダウンミックス係数適用できるわけではなさそう?)して再生できるかぐらいはそれで確認すると良いかもですね。
ADTSに変換してからなんとかする
次に編集した後の後処理はどうするんだとなるんですが、現状LATM/LOASを直接Muxで出来るmuxerはmkvmergeあたりだと思います。つまりみんな大好きL-SMASHだと出来ないっぽい。(これ作ったときの話だから1月とか2月ぐらいの話、派生版追い切れてないのでもしかしたらあるかも)
ちなみに一回matroskaに詰めてからrawAACをdemuxしてADTSのヘッダーを付ければ一応それっぽくはなります。別にこれでも良かったけれど、手間が掛かりすぎるのでLATMのPayload(raw部分)を切り出してLATMのヘッダーに合わせたADTSのヘッダーをとりあえず付けるやつを書きました。
tana3n/Latm_decorder: Convert LATM/LOAS to ADTS
薄々感づいたと思いますがこれで一回ADTSにしてしまえば従来のFakeAACWAVが使えてしまうのでADTSのヘッダーでは表現できないタイプのAAC(ADTSだと7.1chまでの対応なので22.2chのストリームとか)でもなければloas-toolsは要らない子です。おわりです。
DVB系のフォーラムで一度00年代に似たような物が上がってたらしい(現在入手不可)のでもし持ってる人ならそれでも良いかもしれません。
サンプルが少ない上に実装が雑なので刺さるかも。無保証で。
やっつけなのでまだCRCの計算やってなかったり例外処理何もやってないので気が向いたら……(この時点で目的達成してるのでやる気0)
これ書いたのが結構前で完全に忘れてるのでなんかまともに動かんとか特定のサンプルだと刺さるとかあったらなんとかしたいなぁ