yumetodoの旅とプログラミングとかの記録

旅や登山の記録やプログラミング関連の話とかフリーソフト紹介とか

AviUtlでPitch_Controlを使って倍速ビデオを作成する方法

実は私、最近MineCraftの実況動画とか生放送とか見るのにはまっていて、何人かの投稿者を継続して見ています(めいさん、keiさん、きゆみやまさん、じゃりみちさん、てりぃさん等)。
そのなかにミッカさんという投稿主さん、スペランカーでスカイブロック侵攻の人といった方が伝わるかもしれませんが、が居ます。

その方の生放送を見ていて、「倍速編集時に音が高くなるのをどうにかできないか?」という話になり、ぐぐって初めて私は「音程の調整」というプラグインを知りました。

その後いろいろありながら、拡張編集の倍速の限界である8倍速に「音程の調整」プラグインが対応しました。というわけで使い方やらを書いていきます。使い方がちとトリッキーなんだよね、紹介せざるを得ないよね。

導入方法

  1. http://milk-tea.myvnc.com/blog/adiary.cgi/0192
    にアクセスし、
    以下から音程調整プラグインをダウンロードします。
    PitchControl.zip
    からダウンロードする。
  2. ダウンロードしたzipを解凍する
  3. aviutlのプラグインフォルダに入れる

注意事項

  • このプラグインは出力(エンコード)するときに効果を書けます。編集中はプラグインの効果を感じることができません。
    しかし、下記の手順を守れば正しく調整できます。
  • 作者様曰く
    x264guiExを使用してMP4ファイルを出力する場合は、qaac/refalac (AAC/ALACエンコーダ)が必要です。AviUtilで音声速度を変更するとAACの規格外の周波数になります。
    このため周波数変換に対応しているAACエンコーダーが必要となります。
    NeroAacEncを使用すると出力時にエラーになります。
    だそうです。qaacは最新のx264guiEx付属のauo_setup.exeで入れてくれます。なおrigaya氏の他の出力プラグインについても同じことが言えます。

使用方法(拡張編集無使用)

ここでは1.5倍速編集をします。数値は適当に読み替えてください。

  1. まずは普通に動画を読み込みます。

    この時読み込んだ映像が正しく再生されるか確認して下さい。
  2. 「設定」→「フレームレートの変更」で「20fps &lt- 30fps (2/3)」を選択します。
  3. 「編集」→「再生速度の情報を変更」を選択します。

    入力枠の下の数値が読み込んだ動画の情報です。これの1.5倍の値を入力します。


  4. ようやく本題です。
    「設定」→「音程の調整の設定」で

    150と入力します。
    チェックを入れるのをお忘れなく
  5. あとは出力して終わり。上記注意事項をよく見てください。

使用方法(拡張編集無使用)

ここでは4.0倍速編集をします。数値は適当に読み替えてください。

  1. まずはふつーに読み込みます。
  2. を確認する。間違っても本体側と拡張編集側両方で音程の調整プラグインを呼び出さないように
  3. 普通に動画を分割して倍速編集する。




  4. ようやく本題。
    タイムライン右クリック→「フィルターオブジェクトの追加」→音程の調整
    をクリック。

    ダイアログが出てくるが、ここでは設定できないので要注意!
  5. フィルターオブジェクトの長さを倍速編集部分に合わせる。
  6. 「設定」→「音程の調整の設定」で

    400と入力し、必ずチェックを外します。

    拡張編集のダイアログではなく、本体側の設定で数値を指定するのがポイントです。

Infomation for Developer

作者様のブログでのやりとりを要約して、自分の見解や予想を混ぜて下記に記します

入力された「速度」パラメーターが内部でどう処理されているか、ですが、作者様曰く

音程変更のフィルタに入力する数値はセントという単位です。
セントは音程を示す単位で、1オクターブが1200セントと定義されています。
使用してる音程変更フィルタの仕様では-1200~1200セントで音程の変更ができます。
(中略)とりあえず2倍速再生までは正常に対応できる・・・と言うことになります。
とりあえず上記の理論なんですけど、-1200以上の値を設定しても意外にも動作してしまっています。

それで、具体的にどうやってセントに変換しているか、は、教えていただいたソースコードを見ることにしましょう。

filter.h(AviUtl SDK for AviUtl version 0.99i4 以降)

typedef struct {
    //前略
    int		*track;	//トラックバーの設定値郡へのポインタ (AviUtl側で設定されます)
    //後略
} FILTER;

source.cpp(Pitch_Control_003)

FILTER* fp;
//中略
int nPitch = 0;
double fRate = (double)fp->track[0] / 100.0;
if(fRate >= 1.0 && fRate <= 1.5)
{
    nPitch = ((fRate - 1.0) / 0.5) * -800;
}
else if(fRate > 1.5 && fRate <= 2.0)
{
    nPitch = (((fRate - 1.5) / 0.5) * -400) - 800;
}
else{
    nPitch = (int)(-1734.0 * log(fRate) + 1.9172110909451);
}

つまりどうなっているかというと、X = 再生速度 / 100, Pitch = セントと定義すると、

X < 1.0
Pitch = -1734 logeX + 1.9172110909451
1.0 =< X =< 1.5
Pitch = -1600(X - 1)
1.5 < X =< 2.0
Pitch = -800(X - 1.5) - 800
2.0 < X
Pitch = -1734 logeX + 1.9172110909451

となっています。ここで下のグラフを見て欲しいのですが、

1.0 =< X =< 2.0 の範囲で、プログラムでは1次式になっていますが、これはlogの式の近似式ではないか、と予想できます。

リンク