FAWCheckについて
私が勝手にくっつけたFAWCheckなる機能について、どういうことをやってるのかちょっと詳しめな説明。
そもそもFakeAACWaveとは、AACをwavに偽装して、wavとして読み込んでカットしたりできるようにするもの。FAW.exeのGUIなし版がfawcl.exe。
たとえば、
aac -> [FAW.exe] -> 偽装wav -> [Aviutlでカット編集(CMカットとか)] -> カットされた偽装wav -> [FAW.exe] -> カットされたaac
のように使用し、音声をエンコードすることなくカット編集ができる。
(2011.01.04追記)
FAWには一般的な1/1サイズと、もうひとつ1/2サイズってのがあって、1/2サイズは16bitwavではなく、8bitwavで偽装されている。この1/2サイズを使う場合、Aviutl内部は16bitwavなので、16bit->8bit変換をしてやらなければならない。x264guiEx 0.12からこの16bit->8bit変換を行って1/2サイズFAWも扱えるようにした。(もっとも、0.12はバグ持ちなので使えるのは0.13からなるが)
偽装wavはAviutlで出力する際にはきちんとFAW.exeで処理する必要があるけども、たまに設定を間違えて、普通のwavをFAW.exeで処理しようとしてしまい止まったり、逆に偽装wavをneroでエンコードしてしまいおかしなことになったり、ということになってorz
そこで、音声の設定は常に普通のwav用のものにしておき、偽装wavのときには自動的にFAW.exe(fawcl.exe)を使用するようにできないか、と思ってFAWCheckを作ってみた。
・パスの指定
FAW.exe(fawcl.exe)のパスは、外部エンコーダのリストにあるものを使うので、FAWCheckをオンにするには、一度外部エンコーダのところのFAW.exe(fawcl.exe)のパスを正しく指定しておく。指定した後で、外部エンコーダの選択を普通のwavの時の設定(たとえばneroaacencとか)に戻しておく。一度指定してあればおk。
・ファイル出力時の動作
FAWCheckをオンにしておくと、音声のエンコードを開始する前に、まずFakeAACWave(偽装wav)かどうかの判定し、
偽装wavでない(普通のwavだ)、と判定された場合、guiの設定通りに音声エンコードを実行。
偽装wavである、と判定されたときは、guiで設定された音声エンコードの方法を無視して、FAW.exe(fawcl.exe)で音声を処理する。
というふうになる。
つぎに、どうやって判定しているかという話。 偽装wavであるという目印があるのかどうかはよくわからないので、(FAWの詳しい仕様は知らない)、FAWの作る偽装wavの特徴から判定。
音声データで、連続してゼロが続くところを「ゼロブロック」と呼ぶことにする。
普通のwav

普通のwavではゼロ自体が少なく、長いゼロブロックはなかなか登場しない。(上の図)
偽装wav

偽装wavの特徴は、波形で見ると、ある一定以上の長さのゼロブロックが周期的にたくさん登場すること。また、偽装wavではこのゼロブロックの長さがほぼ均一。さらに、ゼロブロックが多い結果、音声データ全体としてもゼロが非常に多い。
そこでまず、音声を少し読み取って、ゼロブロックの数と、そのゼロブロックの長さを取得する。ただし、偽装wavの特徴の「ある一定以上の長さのゼロブロック」を調べたいので、あまりに小さいゼロブロックは無視。
その結果で、判定。
・ゼロブロックが数が少なければ、偽装wavでない。(1フレームに一個分弱ぐらいはあるはず)
・ゼロブロックが多くても、ゼロの数が少なければ、偽装wavでない。(見つかったのは、なんか関係ないゼロブロックかもしんない)
・ゼロがあまりに多い場合は無音音声が考えられるので、これも偽装wavでない。
・ゼロブロックの大きさが不均一な場合、偽装wavでない。(見つかったのは、なんか関係ないゼロブロックかもしんない)
このようにして判定すると、残ったものは偽装wavらしい、ということがわかる。
これだけやれば、誤判定の可能性はほとんどない(と思う)。
そもそもFakeAACWaveとは、AACをwavに偽装して、wavとして読み込んでカットしたりできるようにするもの。FAW.exeのGUIなし版がfawcl.exe。
たとえば、
aac -> [FAW.exe] -> 偽装wav -> [Aviutlでカット編集(CMカットとか)] -> カットされた偽装wav -> [FAW.exe] -> カットされたaac
のように使用し、音声をエンコードすることなくカット編集ができる。
(2011.01.04追記)
FAWには一般的な1/1サイズと、もうひとつ1/2サイズってのがあって、1/2サイズは16bitwavではなく、8bitwavで偽装されている。この1/2サイズを使う場合、Aviutl内部は16bitwavなので、16bit->8bit変換をしてやらなければならない。x264guiEx 0.12からこの16bit->8bit変換を行って1/2サイズFAWも扱えるようにした。(もっとも、0.12はバグ持ちなので使えるのは0.13からなるが)
偽装wavはAviutlで出力する際にはきちんとFAW.exeで処理する必要があるけども、たまに設定を間違えて、普通のwavをFAW.exeで処理しようとしてしまい止まったり、逆に偽装wavをneroでエンコードしてしまいおかしなことになったり、ということになってorz
そこで、音声の設定は常に普通のwav用のものにしておき、偽装wavのときには自動的にFAW.exe(fawcl.exe)を使用するようにできないか、と思ってFAWCheckを作ってみた。
・パスの指定
FAW.exe(fawcl.exe)のパスは、外部エンコーダのリストにあるものを使うので、FAWCheckをオンにするには、一度外部エンコーダのところのFAW.exe(fawcl.exe)のパスを正しく指定しておく。指定した後で、外部エンコーダの選択を普通のwavの時の設定(たとえばneroaacencとか)に戻しておく。一度指定してあればおk。
・ファイル出力時の動作
FAWCheckをオンにしておくと、音声のエンコードを開始する前に、まずFakeAACWave(偽装wav)かどうかの判定し、
偽装wavでない(普通のwavだ)、と判定された場合、guiの設定通りに音声エンコードを実行。
偽装wavである、と判定されたときは、guiで設定された音声エンコードの方法を無視して、FAW.exe(fawcl.exe)で音声を処理する。
というふうになる。
つぎに、どうやって判定しているかという話。 偽装wavであるという目印があるのかどうかはよくわからないので、(FAWの詳しい仕様は知らない)、FAWの作る偽装wavの特徴から判定。
音声データで、連続してゼロが続くところを「ゼロブロック」と呼ぶことにする。
普通のwav

普通のwavではゼロ自体が少なく、長いゼロブロックはなかなか登場しない。(上の図)
偽装wav

偽装wavの特徴は、波形で見ると、ある一定以上の長さのゼロブロックが周期的にたくさん登場すること。また、偽装wavではこのゼロブロックの長さがほぼ均一。さらに、ゼロブロックが多い結果、音声データ全体としてもゼロが非常に多い。
そこでまず、音声を少し読み取って、ゼロブロックの数と、そのゼロブロックの長さを取得する。ただし、偽装wavの特徴の「ある一定以上の長さのゼロブロック」を調べたいので、あまりに小さいゼロブロックは無視。
その結果で、判定。
・ゼロブロックが数が少なければ、偽装wavでない。(1フレームに一個分弱ぐらいはあるはず)
・ゼロブロックが多くても、ゼロの数が少なければ、偽装wavでない。(見つかったのは、なんか関係ないゼロブロックかもしんない)
・ゼロがあまりに多い場合は無音音声が考えられるので、これも偽装wavでない。
・ゼロブロックの大きさが不均一な場合、偽装wavでない。(見つかったのは、なんか関係ないゼロブロックかもしんない)
このようにして判定すると、残ったものは偽装wavらしい、ということがわかる。
これだけやれば、誤判定の可能性はほとんどない(と思う)。
スポンサーサイト