Ads by Google
新しい記事を書く事で広告が消せます。
START+SELECT+L+R
ブログの内容をいったんリセットしました。
雑記的なエントリをすべて削除(結果、殆ど無くなりました
コメントつけてくれていた方にはすみませんです。
雑記的なエントリをすべて削除(結果、殆ど無くなりました
コメントつけてくれていた方にはすみませんです。
Avisynthで切り張りする(編集中
AviSynthでググったらここが2ページ目に出てきてビビった。
そうなるともう少し真面目に書いていかないとなあ。
切り張りする時に使うのは
切り張りに使うTrim関数と、
結合に使うAlignedSpliceやUnalignedSplice関数。または演算子+と++です。
足し算のようにつなげていく事もできるので結構簡単です。
ただし、結合の下準備に
LanczosResize
MONOToStereo
ResampleAudio
AssumeFPS/ChangeFPS/ConvertFPS
などの関数を使わないといけない場合もあります。
説明はまた暇な時にでも書き足し・書き直しをします
そうなるともう少し真面目に書いていかないとなあ。
切り張りする時に使うのは
切り張りに使うTrim関数と、
結合に使うAlignedSpliceやUnalignedSplice関数。または演算子+と++です。
足し算のようにつなげていく事もできるので結構簡単です。
ただし、結合の下準備に
LanczosResize
MONOToStereo
ResampleAudio
AssumeFPS/ChangeFPS/ConvertFPS
などの関数を使わないといけない場合もあります。
説明はまた暇な時にでも書き足し・書き直しをします
色空間
ウィンドウなどの要素がパソコンのディスプレイに表示されるとします。
それらは際には必ずRGB値で出力されます。まあ当前の話ですが。
しかし画像や映像をデータとして保存の場合、いちいちすべてのピクセルを
RGB値で格納していたのではいくら容量が有っても足りません。
よって映像を保存するためにはRGB値は不適切です。
そこで色の情報を格納するための様々な圧縮方法があります。
そういうのが色空間です。が、そこらへんは自分にはまったくわかりません。
趣味でやってるMAD編集なので、別に正確な知識なんぞ要りませんし。
ここで重要なのは、Avisynthで切り張りする際には、動画と動画の
色空間を統一しなければならないという事です。
ここで有用なのは以下の4つの関数
『ConvertToYV12』
クリップの色空間をYV12と呼ばれるものに変換する。色は変換前より若干劣化する。
『ConvertToYUY2』
クリップの色空間をYUY2と呼ばれるものに変換する。色は変換前より若干劣化する。
『ConvertToRGB24』
クリップの色空間をRGB24(RGB)と呼ばれるものに変換する。色は変換前より若干劣化する。
『ConvertToRGB32』
クリップの色空間をRGB32(RGBA)と呼ばれるものに変換する。色は変換前より若干劣化する。
各色空間をおおまかに説明すると
・YV12
DivXやMPEG4系コーデック(というか最近の殆どのコーデック)に使われている色空間。
オーバーレイは扱えない。
・YUY2
主にMPEG1及びMPEG2に使われている色空間。
オーバーレイも扱えるがちょっと限定的。
・RGB24
そのまんまRGB値で動画を扱う。RGBそれぞれに8bitずつで1ピクセルにつき24bit。
RGB32からの変換の場合、おそらく色の劣化はないと思われる。
オーバーレイは扱えない。
・RGB32
そのまんまRGB値で。RGBに加え、透明度の情報を8bit持っている(アルファチャンネルマスク)。
RGB24からの変換の場合、おそらく色の劣化はないと思われる。
オーバーレイも扱える。
####################################
#例えばこういった式を書いても読み込み時にエラーになります
source1 = AviSource("「動画1」へのフルパス").ConvertToYV12
source2 = AviSource("「動画2」へのフルパス").ConvertToRGB24
AlignedSplice(source1, source2)
#source1のは色空間はYV12なのにsource2の色空間はRGB24なので
#これを読み込むとAlignedSplice関数が「色空間が違ぇよ!」といった内容のエラーを返します
#もう一度ConvertTo〜の関数を使ってどちらかに統一してやると成功するはずです
#ただし色空間が同じでも、フレームサイズ、FPS、音声レート、音声チャンネル数の
#どれかが異なっていた場合もAlignedSplice関数はエラーを返します。
#それらの回避方法はまた今度。
####################################
オーバーレイが自由に何回でもできるのがAvisynthの強みっぽいので
RGB32にはかなりお世話になるのではないかと…。
最終的に保存する際にはYV12が最適な場合が多いかと思われます。
それらは際には必ずRGB値で出力されます。まあ当前の話ですが。
しかし画像や映像をデータとして保存の場合、いちいちすべてのピクセルを
RGB値で格納していたのではいくら容量が有っても足りません。
よって映像を保存するためにはRGB値は不適切です。
そこで色の情報を格納するための様々な圧縮方法があります。
そういうのが色空間です。が、そこらへんは自分にはまったくわかりません。
趣味でやってるMAD編集なので、別に正確な知識なんぞ要りませんし。
ここで重要なのは、Avisynthで切り張りする際には、動画と動画の
色空間を統一しなければならないという事です。
ここで有用なのは以下の4つの関数
『ConvertToYV12』
クリップの色空間をYV12と呼ばれるものに変換する。色は変換前より若干劣化する。
『ConvertToYUY2』
クリップの色空間をYUY2と呼ばれるものに変換する。色は変換前より若干劣化する。
『ConvertToRGB24』
クリップの色空間をRGB24(RGB)と呼ばれるものに変換する。色は変換前より若干劣化する。
『ConvertToRGB32』
クリップの色空間をRGB32(RGBA)と呼ばれるものに変換する。色は変換前より若干劣化する。
各色空間をおおまかに説明すると
・YV12
DivXやMPEG4系コーデック(というか最近の殆どのコーデック)に使われている色空間。
オーバーレイは扱えない。
・YUY2
主にMPEG1及びMPEG2に使われている色空間。
オーバーレイも扱えるがちょっと限定的。
・RGB24
そのまんまRGB値で動画を扱う。RGBそれぞれに8bitずつで1ピクセルにつき24bit。
RGB32からの変換の場合、おそらく色の劣化はないと思われる。
オーバーレイは扱えない。
・RGB32
そのまんまRGB値で。RGBに加え、透明度の情報を8bit持っている(アルファチャンネルマスク)。
RGB24からの変換の場合、おそらく色の劣化はないと思われる。
オーバーレイも扱える。
####################################
#例えばこういった式を書いても読み込み時にエラーになります
source1 = AviSource("「動画1」へのフルパス").ConvertToYV12
source2 = AviSource("「動画2」へのフルパス").ConvertToRGB24
AlignedSplice(source1, source2)
#source1のは色空間はYV12なのにsource2の色空間はRGB24なので
#これを読み込むとAlignedSplice関数が「色空間が違ぇよ!」といった内容のエラーを返します
#もう一度ConvertTo〜の関数を使ってどちらかに統一してやると成功するはずです
#ただし色空間が同じでも、フレームサイズ、FPS、音声レート、音声チャンネル数の
#どれかが異なっていた場合もAlignedSplice関数はエラーを返します。
#それらの回避方法はまた今度。
####################################
オーバーレイが自由に何回でもできるのがAvisynthの強みっぽいので
RGB32にはかなりお世話になるのではないかと…。
最終的に保存する際にはYV12が最適な場合が多いかと思われます。
FPSを維持したまま再生スピードを変更
FPSを変えずに再生速度を変えるにはフレーム総数を水増し、間引きしてやればいいので、
以下のFPS関連の関数を組み合わせて関数を定義するのが一番楽
『ChangeFPS』
再生時間と再生速度を維持したままフレームレートを変更する。
つまり変更された分だけフレームを間引いたり水増ししたりする。
元々24FPSのクリップに対しChangeFPS(30)とすると、
1秒につき6フレームの水増しがされる。
『AssumeFPS』
フレーム総数を変更することなくFPSだけを変更する。
元々24FPSのクリップに対しAssumeFPS(30)とすると、
再生速度が30/24倍になり、再生時間は24/30倍になる。
その際sync_audio=TRUEを指定すると、音声の再生速度も
動画に合うように変更される(サンプリングレートが変更される)。
『ResampleAudio』
オーディオの再生速度を変えずにサンプリングレートだけを変更する。
##############################################
#速度を変更する関数を定義。
#float型の引数bairitsuが1.0より大きいときは再生速度は遅く、
#1.0より小さい時は速くなります。
function ChangeSpeed(clip "clip", float "bairitsu")
{
l = clip.audiorate #入力クリップのオーディオサンプリングレートを取得
m = clip.framerate #入力クリップのフレームレートを取得
n = m * bairitsu #フレームレートに引数bairitsuを乗算
ChangeFPS(clip, n) #その数値を元にフレーム数を変更
AssumeFPS(m, sync_audio=TRUE) #元々のフレームレートに戻す。その際音声も動画に合わせて速度変更されるようにしておく
re_clip = ResampleAudio(l) #サンプリングレートが変更されているので元に戻す
return re_clip #戻り値を指定
}
#これでクリップの再生速度がbairitsu倍になって戻ってきます。
##############################################
FC2ブログ、書式の自由度低すぎてワロス
以下のFPS関連の関数を組み合わせて関数を定義するのが一番楽
『ChangeFPS』
再生時間と再生速度を維持したままフレームレートを変更する。
つまり変更された分だけフレームを間引いたり水増ししたりする。
元々24FPSのクリップに対しChangeFPS(30)とすると、
1秒につき6フレームの水増しがされる。
『AssumeFPS』
フレーム総数を変更することなくFPSだけを変更する。
元々24FPSのクリップに対しAssumeFPS(30)とすると、
再生速度が30/24倍になり、再生時間は24/30倍になる。
その際sync_audio=TRUEを指定すると、音声の再生速度も
動画に合うように変更される(サンプリングレートが変更される)。
『ResampleAudio』
オーディオの再生速度を変えずにサンプリングレートだけを変更する。
##############################################
#速度を変更する関数を定義。
#float型の引数bairitsuが1.0より大きいときは再生速度は遅く、
#1.0より小さい時は速くなります。
function ChangeSpeed(clip "clip", float "bairitsu")
{
l = clip.audiorate #入力クリップのオーディオサンプリングレートを取得
m = clip.framerate #入力クリップのフレームレートを取得
n = m * bairitsu #フレームレートに引数bairitsuを乗算
ChangeFPS(clip, n) #その数値を元にフレーム数を変更
AssumeFPS(m, sync_audio=TRUE) #元々のフレームレートに戻す。その際音声も動画に合わせて速度変更されるようにしておく
re_clip = ResampleAudio(l) #サンプリングレートが変更されているので元に戻す
return re_clip #戻り値を指定
}
#これでクリップの再生速度がbairitsu倍になって戻ってきます。
##############################################
FC2ブログ、書式の自由度低すぎてワロス
ズームイン、ズームアウト(内臓フィルタ編)
内臓フィルタのみでズームイン・ズームアウトしてみる。使うのは
『Animate』
詳しくはWikiを参照してほしいが、
つまりは引数を直線的に変化させながらフィルタをかけられるようにする関数。
『LanczosResize』
高性能なリサイズフィルタ
LanczosResize(a, b, c, d, e, f)と書くのは
Crop(c, d, e, f).LanczosResize(a, b)と書くのと同じ。
例えばLanczosResize(640, 480, 8, 0, -8, -0)なら、
左右8ドットを削ってから640×480の解像度にリサイズされる。
#############################
Animate(30,100,"LanczosResize", 512,384,0,0,-0,-0, 512,384,128,96,-128,-96)
#最初は512,384,0,0,-0,-0だった『LanczosResize』の引数が
#変化していき、最終的に512,384,128,96,-128,-96となる
#元々512×384の解像度の動画だったとすると、
#0〜30Frameまではそのままのサイズ、
#30〜100Fにかけて縦横比2倍までズームイン。
#100F以降はそのまま。
#############################
同様の方法でにCropを使ってパンさせることもできなくはないけど、そちらは推奨されません。
慣れたらズーム・パン専用の外部プラグインを入れて使ってみるのも面白い(ただし若干のプログラミング的思考が必要)
『Animate』
詳しくはWikiを参照してほしいが、
つまりは引数を直線的に変化させながらフィルタをかけられるようにする関数。
『LanczosResize』
高性能なリサイズフィルタ
LanczosResize(a, b, c, d, e, f)と書くのは
Crop(c, d, e, f).LanczosResize(a, b)と書くのと同じ。
例えばLanczosResize(640, 480, 8, 0, -8, -0)なら、
左右8ドットを削ってから640×480の解像度にリサイズされる。
#############################
Animate(30,100,"LanczosResize", 512,384,0,0,-0,-0, 512,384,128,96,-128,-96)
#最初は512,384,0,0,-0,-0だった『LanczosResize』の引数が
#変化していき、最終的に512,384,128,96,-128,-96となる
#元々512×384の解像度の動画だったとすると、
#0〜30Frameまではそのままのサイズ、
#30〜100Fにかけて縦横比2倍までズームイン。
#100F以降はそのまま。
#############################
同様の方法でにCropを使ってパンさせることもできなくはないけど、そちらは推奨されません。
慣れたらズーム・パン専用の外部プラグインを入れて使ってみるのも面白い(ただし若干のプログラミング的思考が必要)






