DirectShowSource
(string filename, float "fps", bool "seek",
bool "audio", bool "video", bool "convertfps", bool
"seekzero", int "timeout", string "pixel_type", int
"framecount", string "logfile", int "logmask")
DirectShowSource
は、Windows Media Player が使用するマルチメディア再生システムの DirectShow を使って filename を読み込みます。(DV Type 1 や DirectShow のみのコーデックを使用するファイルのように)AVISource がサポートしない AVI ファイルばかりでなく、MPEG、MP3 や QuickTime を含む、Media Player が再生することのできるほとんどのフォーマットを読み込むことができます。まずは AVISource を使って AVI ファイルを読み込んでみてください。そして、もしそれがうまく行かなかったら、代わりにこのフィルタを試してみてください。
いくつかの注意があります:
FlipVertical
を使わなければなりません。DirectShowSource
("video.asf", fps=15) のようにフレームレートを明示する必要があります。fps: これは、ビデオのフレームレートを明示するために必要とされることがあります。もしフレームレートかフレーム数が間違っていたら(これは asf か mov クリップで起こり得ます)、正しいフレームレートを強制するために、このオプションを使用してください。
seek = true (v2.53 以降): フルシークをサポートします(ほとんどのファイルフォーマットに対して利用可能)。もし問題が起こるようなら、まず seekzero オプションを有効にしてみてください。それでもまだシークが問題を引き起こすなら、シークを完全に無効にしてください*2。シークが無効化されると、後方にシークしようとするときに、オーディオストリームは無音を戻し、ビデオストリームは最後に描画されたフレームを返します。描画された最後のフレームが返されるほか、Avisynth のキャッシュが前の数フレームへの制限されたアクセスを提供するかもしれません。
audio = true (v2.53 以降): DirectShowSource における音声サポートを有効にします。たとえば WMP*3 で再生可能なら(より正確には、GraphEdit で正確にレンダリング*4されるなら)、DirectShowSource は WAV/DTS/AC3/MP3 のようなフォーマットを開くことができます。入力はつねに WAV にデコードされるため、チャンネルオーダーは「WaveFormatExtensible フォーマット*5」と同じです。詳しくは、GetChannel
を参照してください。AviSynth は、8、16、24、32 ビットの整数 PCM サンプルと浮動小数点数 PCM フォーマットを、何チャンネルでも読み込みます。
video = true (v2.52 以降): false に設定すると、音声のみを開けるようになります。
convertfps*6 = false (v2.56 以降): true に設定すると、フレームを複製または省略することによって、可変フレームレート(vfr)のビデオを固定フレームレート(cfr)に変換します。AviSynth で vfr ビデオ(たとえば、混合フレームレートビデオを含む mkv、rmvb、mp4、asf や wmv)を開きたいときに役立ちます。fps パラメータを vfr ビデオを構成するレートの最小公倍数(たとえば 120 や 119.880)に設定すると、非常に有効です。
seekzero = false (v2.56 以降): クリップの開始点へのシークバックのみを制限するオプション。インデックス情報を持たない ASF のようなファイルでの限定的なシークを可能にします。もちろん、前方へのシークはこつこつと(すべてのサンプルを読み込むことによって)実行されます。
timeout = 60000 (ミリ秒単位。60000 ミリ秒 = 1 分)(v2.56 以降): DirectShow が描画を拒否したときの待ち時間を設定します。正の値に設定すると、映像に関しては空のフレームが、音声に関しては無音が返されます。負の値に設定すると、ランタイム例外が投げられます。
pixel_type (v2.56 以降): 生成されるクリップのピクセルタイプ。"YV12"、"YUY2"、"ARGB"、"RGB32"、"RGB24"、"YUV"、"RGB" または "AUTO" のいずれかを指定可能。IPin ネゴシエーション*7に関して、受け入れ可能なビデオストリームのサブフォーマットを制限します。グラフビルダは、リクエストを満たすためにフォーマットコンバータを追加するかもしれません。そのため、使われているコーデックが、実際に、選択されたフォーマットにデコードできることを確認してください。マイクロソフトのフォーマットコンバータで何とか事足ります。"YUV" と "RGB" の疑似タイプはそれぞれ、すべてのサポートされている YUV フォーマットまたは RGB フォーマットへのネゴシエーションを制限します。
framecount (v2.57 以降): これは、ビデオの総フレーム数を明示するために必要とされることがあります。フレームレートかフレーム数が間違っているなら(これは、asf や mov クリップで起こりえます)、正しいフレーム数を強制するためにこのオプションを使用してください。fps も明示された場合、オーディオストリームも調節されます。
logfile (v2.57 以降): このオプションを使ってデバッグ用のログファイルの名前を指定してください。
logmask = 35 (v2.57 以降): logfile を指定した時、このオプションを使ってどの情報を記録するのかを選択してください。
値 | データ |
---|---|
1 | フォーマットネゴシエーション |
2 | 受信サンプル |
4 | GetFrame/GetAudio コール |
8 | Directshow コールバック |
16 | Directshow へのリクエスト |
32 | エラー |
64 | COM オブジェクトの使用回数 |
128 | 新しいオブジェクト |
256 | その他の情報 |
512 | 待機イベント |
最初に利用可能な RGB フォーマット(音声なし)で AVI ファイルを開く:
DirectShowSource("F:\TestStreams\xvid.avi", \ fps=25, audio=false, pixel_type="RGB")
Microsoft の DV デコーダを使って DV クリップを開く:
DirectShowSource("F:\DVCodecs\Analysis\Ced_dv.avi") # MS-DV
可変フレームレートの mkv を、フレームを追加することによって(同期を確保して) 119.88 fps として開く:
DirectShowSource("F:\Guides\Hybrid\vfr_startrek.mkv", \ fps=119.88, convertfps=true)
RealMedia の *.rmvb*8
DirectShowSource("F:\test.rmvb", fps=24, convertfps=true)
GraphEdit ファイルを開く:
V=DirectShowSource("F:\vid_graph.grf", audio=False) # 映像のみ(オーディオレンダラは削除される) A=DirectShowSource("F:\aud_graph.grf", video=False) # 音声のみ(ビデオレンダラは削除される) AudioDub(V, A)
音声の使用例に関しては、下記参照。
AviSynth は、デフォルトで何の問題もなく開くことのできるメディアのみを開こうとします。あるコンポーネントが開けない場合、そのコンポーネントは単に出力ファイルに追加されません。要するに、たとえ問題があってもエラーを確認できない、ということにもなります。失われたコンポーネントに対するエラーメッセージを得るには、audio=false または video=false を使って、実際に機能しているコンポーネントを無効化してください。これで AviSynth は、機能していないコンポーネントに関するエラーメッセージをプリントアウトします。
これはよくあるエラーで、DirectShow が AviSynth で読み込み可能なフォーマットを転送できないときに発生します。フィルタグラフを手動で作成して、AviSynth が開くことのできる出力を転送するフィルタグラフを構築できるかどうか確認してください。もしできないなら、追加で正しい素材を転送できる DirectShow フィルタをダウンロードする必要があるかもしれません。
DirectShow フィルタの中には、正しいサンプリング周波数を報告することに問題があり、そのうえ実際にファイルが再生されているときにこれを補正するものがあるかもしれません。残念ながら、いったんファイルが開かれると、AviSynth にはこれを補正する方法はありません。この問題を修正するには、AssumeSampleRate を使って、正しいサンプリング周波数を設定してください。
残念なことに、Directshow はサンプルアキュレートなシークのサポートを要求されません。別の方法で音声を開くか、もしくはビデオファイルを分離して別の方法で AviSynth に供給してください。ほかにパラメータとして「seekzero = true」または「seek = false」を指定したり、EnsureVBRMP3Sync フィルタを使って Directshow オーディオストリームへのリニアアクセスを強制することもできます。
Microsoft は、最善と考えて ASF デマルチプレクサにおける ASF ストリームのタイミングを実装することを選択しました。その結果、リアルタイムより速く ASF フォーマットファイルを取り除くことは不可能となっています。このことは最初にストリームの処理を開始するときに最も明らかで、通常、Avisynth スクリプトを開いた後、ビデオ編集ソフトを設定するのにしばらく時間がかかります。この間ずっと、マルチプレクサはクレジットタイムを蓄積しています。その後ストリームの処理を開始すると、リアルタイムに追いつくまで最高速度で急ぎ、その時点でソース素材のリアルタイムのレートまで速度を落とします。この機能は、24fps の ASF 素材を PAL 方式のダイレクト再生のために AviSynth を使って 25fps にリクロックすることを不可能にします。
このセクションでは、100% 明白ではないかもしれない、さまざまなタスクについて説明されています。 :)
GraphEdit の GRF ファイルは、.grf というファイル名拡張子によって自動的に検出され、DirectShowSource によって直接読み込まれます。AviSynth がそれに接続できるようにするには、AviSynth が接続可能なメディアタイプのピンを GraphEdit で開いておかなければなりません。AviSynth は、どんなフィルタも切断しようとはしません。そのため、出力タイプが正確であることが重要です。DirectShowSource は、YV12、YUY2、ARGB、RGB32、RGB24 のビデオフォーマットと、32 ビット、24 ビット、16 ビット、8 ビットの PCM と IEEE FLOAT のオーディオフォーマットのみ受け入れます。
与えられた GRF ファイルは、DirectShowSource が開いているピンへの接続を試みる時の混乱を避けるために、オーディオストリームかビデオストリームのいずれか 1 つのみをターゲットとすべきです。バージョン 2.5.7 からは、この単一ストリーム制限が強制されます。
これを行う方法は、基本的に 2 つあります。1 つ目は、AC3 デコーダ自身の設定でダウンミックスを設定することです。2 つ目は、「Trombettworks」という外部のダウンミキサを使用することです:
1) AC3filter をインストールしてください。Windows Media Player 6.4 で AC3ファイルを開き、ファイルのプロパティを選択してください。AC3Filter の出力を 2/0 - stereo に設定してください。もし最高品質にしたいなら、Sample フォーマットとして PCM Float を選択してください。
次のスクリプトを作成してください:
v = Mpeg2Source("e:\movie.d2v") a = DirectShowSource("e:\Temp\Test2\test.ac3") AudioDub(v,a)最後に VirtualDub でこのスクリプトを開いて、オーディオストリームを MP3 に変換してください(もちろん、必要なら、ダウンミックスされた WAV ストリームを分離することもできます)。
2) Trombettworks の Channel Downmixer DirectShow フィルタをレジストリ登録してください(スタート -> ファイル名を指定して実行)*9:
regsvr32 ChannelDownmixer.ax
Windows Media Player 6.4 で AC3 を開き、ファイルのプロパティを選択します。AC3Filter の出力を 3/2+SW 5.1 channels に設定します(このダウンミキサは PCM Float を扱うことが出来ません。そのため、ここでは PCM 16bit が選択されています)。ダウンミキサのプロパティでは、入出力チャンネルが自動的に検出されなければなりません。これが実際に正しいかどうかチェックしてください。
次のスクリプトを作成してください:
v = Mpeg2Source("e:\movie.d2v") a = DirectShowSource("e:\Temp\Test2\test.ac3") AudioDub(v,a)最後に VirtualDub でこのスクリプトを開き、音声ストリームを MP3 に変換してください(もちろん、必要なら、ダウンミックスされた WAV ストリームを分離することもできます)。
どういうわけか、これは DTS ストリームではうまく行きません :(
更新履歴
v2.56 | convertfps は、フレームを追加することによって VFR を CFR にする |
seekzero は、先頭へのシークのみを制限する | |
timeout は、扱いにくいグラフへの反応を制御する | |
pixel_type は、出力ビデオのピクセルフォーマットを明示/制限する | |
v2.57 | framecount は、ストリームの長さをオーバーライドする。 |
logfile と logmask は、デバッグロギングを指定する。 |
原文 Date: 2008/03/25 21:50:24
日本語訳 $Date: 2008/06/22 07:41:11 $