DirectShowSource のバックアップの現在との差分(No.3)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
 DirectShowSource(string filename [, float fps] [, bool seek] [, bool audio] [, bool video])
#pre{{
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メディアプレイヤーが使用しているマルチメディア再生システムのDirectShowを使用してfilenameを読み取ります。メディアプレイヤーが再生することのできる、ほとんどのフォーマットを読み取ることができます。その中には、(DV Type-1、あるいはDirectShowのみのコーデックを使用するファイルのように)AVISourceがサポートしていないAVIファイルばかりでなく、MPEG、MP3、そしてQuickTimeファイルも含まれています。まず最初に、AVISourceでAVIファイルを読み込んでみてください。そして、それがうまく行かなかったら、代わりに、このフィルタを試してみてください。
DirectShowSource は、Windows Media Player が使用するマルチメディア再生システムの DirectShow を使って '''filename''' を読み込みます。(DV Type 1 や DirectShow のみのコーデックを使用するファイルのように)AVISource がサポートしない AVI ファイルばかりでなく、MPEG、MP3 や QuickTime を含む、Media Player が再生することのできるほとんどのフォーマットを読み込むことができます。まずは AVISource を使って AVI ファイルを読み込んでみてください。そして、もしそれがうまく行かなかったら、代わりにこのフィルタを試してみてください。

いくつかの注意があります:

+いくつかのデコーダ(特にMS MPEG-4)は、天地が逆さまのビデオを作り出すでしょう。その場合、[[FlipVertical>Flip]]を使わなければなりません。
+DirectShowビデオデコーダは、正確なフレームのシーク(frame-accurate seeking)をサポートしなくても構いません。ほとんどの場合、シークは機能するでしょうが、場合によっては、うまく機能しないかもしれません。
+DirectShowビデオデコーダは、入力ビデオのフレームレートを知らせることさえも要求されません。ほとんどのデコーダはフレームレートを教えてくれますが、 ASFデコーダでは不可能です。fpsパラメータを使って、フレームレートを指定しなければなりません: DirectShowSource("video.asf", fps=15) 。
+このバージョンは、Microsoft DVコーデックを自動的に検出し、それを(ハーフではなく)フル解像度でデコードするようにします。これは注意ではないと思いますが。 :-)
+デコーダの中には(とりわけ MS MPEG-4)は、上下逆さまのビデオを作り出すものがあります。その場合、[[FlipVertical>Flip]] を使わなければなりません。
+DirectShow ビデオデコーダは、フレームアキュレートなシークをサポートする必要はありません。たいていの場合、シークは機能しますが、場合によっては機能しないこともあるかもしれません。
+DirectShow ビデオデコーダは、入力ビデオのフレームレートを知らせることさえも要求されません。ほとんどのデコーダはフレームレートを教えてくれますが、 ASF((訳者註: Microsoft 社の Windows Media で使用されるファイルコンテナ形式の 1 つ。Advanced Systems Format の略。参考: [[Advanced Systems Format - Wikipedia:http://ja.wikipedia.org/wiki/Advanced_Systems_Format]]。)) デコーダは教えてくれません。fps パラメータを使って、DirectShowSource("video.asf", fps=15) のようにフレームレートを明示する必要があります。
+このバージョンは、Microsoft DV コーデックを自動的に検出し、(ハーフ解像度ではなく)フル解像度でデコードさせます。これは、注意ではありませんね。 :-)
+またこのバージョンは、どんなデコーダベースのインターレース解除も無効にしようとします。

v2.53から、いくつかの機能が追加されました:
'''fps''': これは、ビデオのフレームレートを明示するために必要とされることがあります。もしフレームレートかフレーム数が間違っていたら(これは asf か mov クリップで起こり得ます)、正しいフレームレートを強制するために、このオプションを使用してください。

-DirectShowSourceにおける音声サポート。WAV/DTS/AC3/MP3などのフォーマットについても、もしそれらのファイルがWMPで再生できるなら(より正確には: それらのファイルがGraphEditで正しく描画されるなら)、DirectShowSourceは、それらのファイルを開くことが出来ます。チャンネルの順序は、[[[wave-format-extensible format]:http://www.cs.bath.ac.uk/~jpff/NOS-DREAM/researchdev/wave-ex/wave_ex.html]]に書かれているのと同じです。なぜなら、入力ファイルは、いつもWAVにデコードされるからです。より詳しい情報を知りたい方は、GetChannelも参考にしてください。AviSynthは、8, 16, 24, 32ビットのPCM(int)サンプルとPCM(float)フォーマット読み込みます。どんなチャンネル数にも対応しています。
-フル・シークのサポート(ほとんどのファイル形式で利用可能)。
-GraphEdit(GRF)ファイルのサポート。
'''seek''' = true (v2.53 以降): フルシークをサポートします(ほとんどのファイルフォーマットに対して利用可能)。もし問題が起こるようなら、まず '''seekzero''' オプションを有効にしてみてください。それでもまだシークが問題を引き起こすなら、シークを完全に無効にしてください((訳者註: 「seek = false」にすることで、シークを無効化することができます。))。シークが無効化されると、後方にシークしようとするときに、オーディオストリームは無音を戻し、ビデオストリームは最後に描画されたフレームを返します。描画された最後のフレームが返されるほか、Avisynth のキャッシュが前の数フレームへの制限されたアクセスを提供するかもしれません。

#br
**ビデオとオーディオのトラブルシューティング [#c35580b8]
AviSynthは、デフォルトで、問題なく開くことができるメディアだけを開こうとするようになっています。あるコンポーネントが開けない場合は、単純に出力ファイルに追加されなくなります。これは、たとえ問題があっても、エラーを確認できないということを意味します。失われたコンポーネントに対するエラーメッセージを得るためには、audio=falseかvideo=falseを使って、実際に動作しているコンポーネントを無効化してください。これによって、AviSynthは、機能していないコンポーネントに関するエラーメッセージをプリントアウトするでしょう。
'''audio''' = true (v2.53 以降): DirectShowSource における音声サポートを有効にします。たとえば WMP((訳者註: Windows Media Player の略。)) で再生可能なら(より正確には、GraphEdit で正確にレンダリング((訳者註: 「ストリームのレンダリングに必要な残りのフィルタを GraphEdit が自動的に追加および接続すること」([[GraphEdit による TV ハードウェアおよびソフトウェアのテスト(MSDN Japan):http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/testingtvhardwareandsoftwarewithgraphedit.asp]]より引用。)))されるなら)、DirectShowSource は WAV/DTS/AC3/MP3 のようなフォーマットを開くことができます。入力はつねに WAV にデコードされるため、チャンネルオーダーは「[[WaveFormatExtensible フォーマット:http://www.cs.bath.ac.uk/~jpff/NOS-DREAM/researchdev/wave-ex/wave_ex.html]]((訳者註: 参考: [[WAVEFORMATEX:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/directx9_c/directx/htm/waveformatex.asp]]、[[WAVEFORMATEXTENSIBLE:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/directx9_c/directx/htm/waveformatextensible.asp]]、[[マルチチャンネル WAV フォーマット:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/directx9_c/directx/htm/multichannelwavformats.asp]]))」と同じです。詳しくは、[[GetChannel]] を参照してください。AviSynth は、8、16、24、32 ビットの整数 PCM サンプルと浮動小数点数 PCM フォーマットを、何チャンネルでも読み込みます。

***"The Filter Graph won't talk to me" !!!(フィルタグラフが話かけてこないよ!!!) [#w9c9781c]
'''video''' = true (v2.52 以降): false に設定すると、音声のみを開けるようになります。

これは、DirectShowがAviSynthで読み込めるフォーマットを転送できない時に、よく起こるエラーです。手動でフィルタグラフを作成してみて、AviSynthで開ける出力ファイルを転送するようなフィルタグラフを構築できるかどうか確かめてください。もし出来ないようであれば、正しい素材を転送できるDirectShowフィルタを、追加でダウンロードする必要があるのかもしれません。
'''convertfps'''((訳者註: convertfps パラメータの機能は、[[にゃおでぃお - 音楽圧縮に関するウェブページ (旧 Vorbish: 気まぐれなVorbis追っかけ):http://nyaochi.sakura.ne.jp/xoops/]]のにゃおち(Nyaochi)さんによる [[DirectShowSource with ConvertFPS:http://nyaochi.sakura.ne.jp/xoops/modules/mydownloads/singlefile.php?cid=2&lid=3]] が元になっています。参考: [[AviSynth Wiki - niiyan/2005-03-03:http://www.avisynth.info/?niiyan%2F2005-03-03#bc04a9f1]]。)) = false (v2.56 以降): true に設定すると、フレームを複製または省略することによって、可変フレームレート(vfr)のビデオを固定フレームレート(cfr)に変換します。AviSynth で vfr ビデオ(たとえば、混合フレームレートビデオを含む mkv、rmvb、mp4、asf や wmv)を開きたいときに役立ちます。'''fps''' パラメータを vfr ビデオを構成するレートの最小公倍数(たとえば 120 や 119.880)に設定すると、非常に有効です。

***The samplerate is wrong!(サンプリング周波数が不正!) [#s275812c]
'''seekzero''' = false (v2.56 以降): クリップの開始点へのシークバックのみを制限するオプション。インデックス情報を持たない ASF のようなファイルでの限定的なシークを可能にします。もちろん、前方へのシークはこつこつと(すべてのサンプルを読み込むことによって)実行されます。

いくつかのフィルタは、正しいサンプリング周波数を報告することに関して問題を抱えており、ファイルが実際に再生している時に、これを訂正するかもしれません。不幸なことに、いったんファイルが開かれてしまうと、AviSynthがこれを訂正する方法はありません。"AssumeSampleRate"を使って、正しいサンプリング周波数に設定し、この問題を修正してください。
'''timeout''' = 60000 (ミリ秒単位。60000 ミリ秒 = 1 分)(v2.56 以降): DirectShow が描画を拒否したときの待ち時間を設定します。正の値に設定すると、映像に関しては空のフレームが、音声に関しては無音が返されます。負の値に設定すると、ランタイム例外が投げられます。

***My sound is choppy(音声が途切れ途切れだ) [#dc8375c8]
'''pixel_type''' (v2.56 以降): 生成されるクリップのピクセルタイプ。"YV12"、"YUY2"、"ARGB"、"RGB32"、"RGB24"、"YUV"、"RGB" または "AUTO" のいずれかを指定可能。IPin ネゴシエーション((訳者註: [[まるも製作所:http://www.marumo.ne.jp/]]の[[6月15日(水) DirectShow の仕組み [4]:http://www.marumo.ne.jp/db2005_6.htm#15]]を参照。))に関して、受け入れ可能なビデオストリームのサブフォーマットを制限します。グラフビルダは、リクエストを満たすためにフォーマットコンバータを追加するかもしれません。そのため、使われているコーデックが、実際に、選択されたフォーマットにデコードできることを確認してください。マイクロソフトのフォーマットコンバータで何とか事足ります。"YUV" と "RGB" の疑似タイプはそれぞれ、すべてのサポートされている YUV フォーマットまたは RGB フォーマットへのネゴシエーションを制限します。

不幸にも、DirectShowでは、100%正確にシークすることは不可能です。精度は、常に、コンテナ・フォーマットに左右されます。音声を別の方法で開くか、ビデオファイルを分離してから、AviSynthに渡してみてください。ほかに、"seek = false"をパラメータとして明示することもできます。
'''framecount''' (v2.57 以降): これは、ビデオの総フレーム数を明示するために必要とされることがあります。フレームレートかフレーム数が間違っているなら(これは、asf や mov クリップで起こりえます)、正しいフレーム数を強制するためにこのオプションを使用してください。fps も明示された場合、オーディオストリームも調節されます。

**コモン・タスク(Common tasks) [#jf61e7e0]
これを行うための方法は、本質的には、2つあります。その1つ目は、あなたが使用しているAC3デコーダ自身の設定でダウンミックスすることです。そして、2つ目の方法は、"Trombettworks"という外部のダウンミキサーを使うことです:
'''logfile''' (v2.57 以降): このオプションを使ってデバッグ用のログファイルの名前を指定してください。

1) AC3filterをインストールしてください。WMP(Windows Media Player)6.4でAC3ファイルを開いて、ファイルのプロパティを選択します。AC3Filterの出力を、2/0 - stereoに設定します。もし、あなたが、可能な範囲で最高の品質を得たいなら、サンプル・フォーマットとしてPCM Floatを選択してください。
'''logmask''' = 35 (v2.57 以降): logfile を指定した時、このオプションを使ってどの情報を記録するのかを選択してください。

次のスクリプトを作成します:
|~値|~データ|
|1|フォーマットネゴシエーション|
|2|受信サンプル|
|4|GetFrame/GetAudio コール|
|8|Directshow コールバック|
|16|Directshow へのリクエスト|
|32|エラー|
|64|COM オブジェクトの使用回数|
|128|新規オブジェクト|
|256|その他の情報|
|512|待機イベント|

 v = Mpeg2Source("e:\movie.d2v")
 a = DirectShowSource("e:\Temp\Test2\test.ac3")
 AudioDub(v,a)
記録する必要のあるデータの値を足してください。すべてを記録するには -1 を指定してください。デフォルト(35)は、フォーマットネゴシエーションと受信されたサンプルとエラー(すなわち、1+2+32)を記録します。

最後に、そのスクリプトをVirtualDubで開いて、音声ストリームをMP3に変換してください(もちろん、必要ならば、ダウンミックスされたWAVストリームを分離することもできます)。
** 使用例 [#r4d62508]

2) DirectShowフィルタ[[[Channel Downmixer by Trombettworks]:http://www.trombettworks.com/directshow.php]]をレジストしてください([スタート] -> [ファイル名を指定して実行(R)])((同梱されているRegister ChannelDownmixer.batでレジストすることができます。)):
最初に利用可能な RGB フォーマット(音声なし)で AVI ファイルを開く:

 regsvr32 ChannelDownmixer.ax 
#pre{{
DirectShowSource("F:\TestStreams\xvid.avi", 
\       fps=25, audio=false, pixel_type="RGB")
}}

WMP6.4でAC3ファイルを開いて、ファイルのプロパティを選択します。AC3Filterの出力を、''3/2+SW 5.1 channels''に設定します(このダウンミキサーはPCM Floatを扱うことが出来ません。そのため、ここでは、PCM 16bitが選択されます)。ダウンミキサーのプロパティでは、入出力チャンネルが自動的に検出されるでしょう。これが実際に正しいかどうかチェックしてください。
Microsoft の DV デコーダを使って DV クリップを開く:

次のスクリプトを作成します:
#pre{{
DirectShowSource("F:\DVCodecs\Analysis\Ced_dv.avi") # MS-DV
}}

 v = Mpeg2Source("e:\movie.d2v")
 a = DirectShowSource("e:\Temp\Test2\test.ac3")
 AudioDub(v,a)
可変フレームレートの mkv を、フレームを追加することによって(同期を確保して) 119.88 fps として開く:

最後に、そのスクリプトをVirtualDubで開いて、音声ストリームをMP3に変換してください(もちろん、必要ならば、ダウンミックスされたWAVストリームを分離することもできます)。
#pre{{
DirectShowSource("F:\Guides\Hybrid\vfr_startrek.mkv",
\ fps=119.88, convertfps=true)
}}

何らかの理由により、DTSストリームでは、これがうまく行きません :(
RealMedia の *.rmvb((訳者註: RealMedia Variable Bitrate Movie File の拡張子。Variable Bitrate は「可変ビットレート」の意味。参考: [[RealMedia - Wikipedia:http://ja.wikipedia.org/wiki/RealMedia]]))

#pre{{
DirectShowSource("F:\test.rmvb", fps=24, convertfps=true)
}}

GraphEdit ファイルを開く:

#pre{{
V=DirectShowSource("F:\vid_graph.grf", audio=False) # 映像のみ(オーディオレンダラは削除される)
A=DirectShowSource("F:\aud_graph.grf", video=False) # 音声のみ(ビデオレンダラは削除される)
AudioDub(V, A)
}}

音声の使用例に関しては、下記参照。

** ビデオとオーディオ問題のトラブルシューティング [#b2c4a952]

AviSynth は、デフォルトで何の問題もなく開くことのできるメディアのみを開こうとします。あるコンポーネントが開けない場合、そのコンポーネントは単に出力ファイルに追加されません。要するに、たとえ問題があってもエラーを確認できない、ということにもなります。失われたコンポーネントに対するエラーメッセージを得るには、audio=false または video=false を使って、実際に機能しているコンポーネントを無効化してください。これで AviSynth は、機能していないコンポーネントに関するエラーメッセージをプリントアウトします。

*** 「RenderFile, the filter graph manager won't talk to me」 [#de152652]

これはよくあるエラーで、DirectShow が AviSynth で読み込み可能なフォーマットを転送できないときに発生します。フィルタグラフを手動で作成して、AviSynth が開くことのできる出力を転送するフィルタグラフを構築できるかどうか確認してください。もしできないなら、追加で正しい素材を転送できる DirectShow フィルタをダウンロードする必要があるかもしれません。

*** The samplerate is wrong! [#q6d59eda]

DirectShow フィルタの中には、正しいサンプリング周波数を報告することに問題があり、そのうえ実際にファイルが再生されているときにこれを補正するものがあるかもしれません。残念ながら、いったんファイルが開かれると、AviSynth にはこれを補正する方法はありません。この問題を修正するには、[[AssumeSampleRate]] を使って、正しいサンプリング周波数を設定してください。

*** My sound is choppy [#pb59c1de]

残念なことに、Directshow はサンプルアキュレートなシークのサポートを要求されません。別の方法で音声を開くか、もしくはビデオファイルを分離して別の方法で AviSynth に供給してください。ほかにパラメータとして「seekzero = true」または「seek = false」を指定したり、[[EnsureVBRMP3Sync]] フィルタを使って Directshow オーディオストリームへのリニアアクセスを強制することもできます。

*** My ASF renders start fast and finish slow [#vf46e98d]

Microsoft は、最善と考えて ASF デマルチプレクサにおける ASF ストリームのタイミングを実装することを選択しました。その結果、リアルタイムより速く ASF フォーマットファイルを取り除くことは不可能となっています。このことは最初にストリームの処理を開始するときに最も明らかで、通常、Avisynth スクリプトを開いた後、ビデオ編集ソフトを設定するのにしばらく時間がかかります。この間ずっと、マルチプレクサは'''クレジット'''タイムを蓄積しています。その後ストリームの処理を開始すると、リアルタイムに追いつくまで最高速度で急ぎ、その時点でソース素材のリアルタイムのレートまで速度を落とします。この機能は、24fps の ASF 素材を PAL 方式のダイレクト再生のために AviSynth を使って 25fps にリクロックすることを不可能にします。

** 一般的なタスク [#o070f56e]

このセクションでは、100% 明白ではないかもしれない、さまざまなタスクについて説明されています。 :)

*** GRF ファイルを開く [#g9c320e2]

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 からは、この単一ストリーム制限が強制されます。

*** AC3 をステレオにダウンミックスする [#rb3a3077]

これを行う方法は、基本的に 2 つあります。1 つ目は、AC3 デコーダ自身の設定でダウンミックスを設定することです。2 つ目は、「Trombettworks」という外部のダウンミキサを使用することです:

1) AC3filter をインストールしてください。Windows Media Player 6.4 で AC3ファイルを開き、ファイルのプロパティを選択してください。AC3Filter の出力を 2/0 - stereo に設定してください。もし最高品質にしたいなら、Sample フォーマットとして PCM Float を選択してください。

&ref(ac3downmix1a.jpg);
&ref(ac3downmix1b.jpg);

次のスクリプトを作成してください:

#pre{{
v = Mpeg2Source("e:\movie.d2v")
a = DirectShowSource("e:\Temp\Test2\test.ac3")
AudioDub(v,a)
}}

最後に VirtualDub でこのスクリプトを開いて、オーディオストリームを MP3 に変換してください(もちろん、必要なら、ダウンミックスされた WAV ストリームを分離することもできます)。

2) [[Trombettworks の Channel Downmixer:http://www.trombettworks.com/directshow.php]] DirectShow フィルタをレジストリ登録してください(スタート -> ファイル名を指定して実行)((訳者註: 同梱されている Register ChannelDownmixer.bat でも登録することができるようです。)):

 regsvr32 ChannelDownmixer.ax

Windows Media Player 6.4 で AC3 を開き、ファイルのプロパティを選択します。AC3Filter の出力を ''3/2+SW 5.1 channels'' に設定します(このダウンミキサは PCM Float を扱うことが出来ません。そのため、ここでは PCM 16bit が選択されています)。ダウンミキサのプロパティでは、入出力チャンネルが自動的に検出されなければなりません。これが実際に正しいかどうかチェックしてください。

&ref(ac3downmix2a.jpg); 
&ref(ac3downmix2b.jpg);

&ref(ac3downmix2c.jpg);

次のスクリプトを作成してください:

#pre{{
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 は、デバッグロギングを指定する。|

#hr

註: このページは、AviSynth 2.5.8 RC3 に同梱されている英語版ヘルプの日本語訳です。原文は、AviSynth をインストールしたフォルダ内の Docs/english/corefilters/directshowsource.htm にあります。なお、このページのテキストおよび画像のライセンスは、オリジナルのそれに準じます。詳しくは、[[AboutLicense]] を参照してください。