2008/03/13
動画作成云々 rev.2。

氏とものすごい勢いで色空間なりのお話をしていたのでとりあえずまとめ。多分gochaさんの記事とかなり被る気がします。

その前に色空間についてなんですが、何せ私自身劣化するぐらいの知識しかない&検索しても小難しいので、とりあえずきれいにするにはできる限りこの変換を避けるといい感じです。

1.Snes9xから出力(RGB)
ここはロスレス出力する以外に注意は要らないと思います。ただ、エンコーダ付属の色空間変換がちょっとまずかったりするかもしれない場合は、明示的になっているもの(HuffyuvとかLegarithとか)を使うと安心できるかもしれません。

2.AviSynthで編集、YUY2なりYV12なりに変換
ConvertTo*は最初か最後にやれば良いです。ただ処理速度的にYV12>>YUY2>>RGBらしいんで特に問題が無い場合は最初にやった方が良いです。
あとはResize系やらSubtitleやら煮るなり焼くなり。個人的にはffdshowを利用すればアスペクト比を保存したまま勝手にボーダーつけてくれるんでオススメ。ただ内部的にどうなってるか知らないので責任は取れない。
プラグインによりますが色空間で支障が出る場合があります。YV12でリサイズすると縞が出たり。)

3.VirtualDubで再圧縮
ここで注意。保存するときの違い。
[ストリームの直接コピー]
コーデックの形式を保存したまま切り出したりできる。
[高速再圧縮]
色空間を変換せずにエンコーダに放り投げる。普通はコレ。
[標準再圧縮]
RGBに変換してエンコーダに放り投げる。大抵のコーデックはRGBに対応しているのでエラーが出る場合はこっちだと回避できるかも。(x264はr733からYV12のみ?)
[完全処理モード]
VirtualDub内部のフィルタを使う人はこちら。自動的にRGBで吐き出されます。※大抵はAviSynthで事足りるので非推奨。
(AviUtilはYUV444なんてものを使ってるらしいですがそんなの関係ねぇ。)

おっそいなあと思う人はもう一度ご確認を、YUY2(ソース)->RGB(VD)->YUY2(エンコーダ)なんてことになってるかもしれません。あと、AviSynthScriptの出力から直接エンコードするよりも、もう一度ロスレスで作ってエンコーダに投げた方が失敗したときに泣かなくてすみます。
まあ色空間関連でなんか起こることはめったに無いと(少なくとも私は)思いますが。。。(少なくとも見た目の範囲で)

大抵この3工程で事足りると思います。一番重要(というか手間がかかる)のは2ですね。編集がグラフィカルにできないのでめんどくさいと思いますが、慣れればやれることはホントに多いです。そんでもって最初に疲れたあとは流用がききます。


何がいいたいのかわからなくなってしまった。。。

オマケ。きったないソースだなぁorz


(追記:03/14/20:30)
ついでに音声についても言及しときます。Windows環境なのはあしからず。
Snes9xでは選択した動画形式+WAV(PCM)のAVI(多分1.0)形式で書き出されます。その際、規定のファイルサイズである2GiB以上になると(FileName)_part?.aviで続きが作られます。
コレをつなげる場合は、AviSynthScriptで
AVISource("FileName.avi","FileName_part2.avi" ...)
と記述すればきれいにつながってくれます。
//
余談。私はAVIコーデック参照化ソフトなるものを使って出力をしています。AVISourceで連結した場合、Access Violationが出る場合があるから・・・というのは建前で、Snes9xが分割保存してくれるのを後で知ったからです。コレを使うととりあえず色々なことを気にしないで色々できます。
//
このとき時々問題になるのが、"音声がズレる"場合があるということです。主に32kHzやら低周波数の時に起こりそうみたいです。その場合は、VirtualDubなり何なりを使って一度AVIファイルから音声を分離orコピーして、ずれている長さ分音声の長さを調整してください。
(コチラさんのWave Time Controlを使うと楽かもしれません。)

その後、FLVの場合はLIFEなりを使ってmp3を作成してください。CBR,ABRだとサイズ予測がしやすいと思います。
(H.264の場合はNeroAACEncを使ってください。要検索)

そんでもってどうにかしてFLVなりMP4なりにmux(多重化)してください。それでまた音ズレが発生するようならもう一回調整してmuxの繰り返し。これで完成のはず。


(追記:03/14/23:50)

AviSynthでのffdshow()について追記。詳しく知りたい人はAviSynthWikiを見てください。
ffdshow("(プリセット名)","(オプション)")で使えます。プリセットが存在する場合にはオプションが設定値にオーバーライドされ、プリセットが存在しない値の場合指定したオプションのみが適用されます。あ、先にプラグインをロードしてくださいね。
つまりこういうこと。

clip = clip.ffdshow("foo","")
#プリセット"foo"を適用します。
clip = clip.ffdshow("null","isResize=1,resizeMethod=16")
#プリセットは無いと仮定。hq2xフィルタのみ適用されます。
clip = clip.ffdshow("null","isResize=1,resizeMode=0,resizeAscpect=1,\
resizeDx=512,resizeDy=384,resizeMethod=9")
#Lanczosでアスペクト比を保ったまま512x384にリサイズ。

#resizeMethodについて
# 0 = Fast Bilinear 1 = Bilinear
# 2 = Bicubric 4 = Point
# 5 = Area 7 = Gauss
# 8 = Sinc 9 = Lanczos
# 10= Spline 12= Simple Resize
# 13= Warped Resize
# 14= Super2xSaI*
# 15= 2xSaI* 16= hq2x*
# *2x系についてはresizeDx,Dyで指定した値に関係なしに2倍にリサイズします。
# なので2x系で拡大したあと他のメソッドでリサイズするときれいかもしれません。

正直、ffdshowを使う場合はGUIのプリセットで詳細に設定した方がグラフィカルで楽できれいです。多分。



0 Comments | コメントを書く
Template Design: © 2007 Envy Inc.