DirectShowSource のバックアップ差分(No.14)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
#code(nonumber){{
DirectShowSource(string filename [, float fps, bool seek, bool audio, bool video, bool convertfps, bool seekzero, int timeout, string pixel_type])
}}

** 解説 [#e82d4a4c]

''filename'': DirectShowSourceは、Windowsメディアプレイヤーが使用しているマルチメディア再生システムのDirectShowを使用してfilenameを読み取ります。メディアプレイヤーが再生することのできる、ほとんどのフォーマットを読み取ることができます。その中には、(DV Type-1、あるいはDirectShowのみのコーデックを使用するファイルのように)AVISourceがサポートしていないAVIファイルばかりでなく、MPEG、MP3、そしてQuickTimeファイルも含まれています。まず最初に、AVISourceでAVIファイルを読み込んでみてください。そして、それがうまく行かなかったら、代わりに、このフィルタを試してみてください。v2.53から、GraphEdit(grf)ファイルにも対応しています。

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

+いくつかのデコーダ(特にMS MPEG-4)は、天地が逆さまのビデオを作り出すでしょう。その場合、[[FlipVertical>Flip]]を使わなければなりません。
+DirectShowビデオデコーダは、正確なフレームのシーク(frame-accurate seeking)をサポートしなくても構いません。ほとんどの場合、シークは機能するでしょうが、場合によっては、うまく機能しないかもしれません。
+DirectShowビデオデコーダは、フレーム・アキュレートなシーク(frame-accurate seeking)をサポートしなくても構いません。ほとんどの場合、シークは機能するでしょうが、場合によっては、うまく機能しないかもしれません。
+DirectShowビデオデコーダは、入力ビデオのフレームレートを知らせることさえも要求されません。ほとんどのデコーダはフレームレートを教えてくれますが、 ASFデコーダでは不可能です。fpsパラメータを使って、フレームレートを指定しなければなりません: DirectShowSource("video.asf", fps=15) 。
+このバージョンは、Microsoft DVコーデックを自動的に検出し、それを(ハーフではなく)フル解像度でデコードするようにします。これは注意ではないと思いますが。 :-)
+また、このバージョンは、どんなデコーダーベースのインターレース解除をも無効にしようとします。

''fps'': これは、ビデオのフレームレートを指定するために、時々、必要とされます。もしフレームレートかフレームの数が間違っているなら(これはasfかmovクリップについて起こりえます)、正しいフレームレートを強制するために、このオプションを使用してください。

''seek'' = true (v2.53から): 完全なシークのサポートがあります(ほとんどのファイルフォーマットに対して利用可能)。問題が起こるなら、まずためしにseekzeroオプションを有効にしてみてください。もしまだシークが問題を引き起こすなら、シークを完全に無効にしてください。シークが無効化されていると、後方にシークしようとするときに、オーディオ・ストリームは無音を返し、ビデオ・ストリームは最後にレンダリングされたフレームを返します。AviSynthのキャッシュは、前の数フレームへの制限されたアクセスを提供するかもしれず、それを超えるとレンダリングされた最後のフレームが返されるであろうということに注意してください。

''audio'' = true (v2.53から): DirectShowSourceにおいて、オーディオサポートがあります。もしあなたが、たとえばWMP((訳者註: Windows Media Playerの略。))で、WAV/DTS/AC3/MP3のようなフォーマットを再生することができるとすれば(より正確には: もしそれらのファイルがGraphEditで正しくレンダリングされるとすれば)、DirectShowSourceは、それらのファイルを開くことができます。チャンネルの配置(ordening)は、[[[wave-format-extensible format]:http://www.cs.bath.ac.uk/~jpff/NOS-DREAM/researchdev/wave-ex/wave_ex.html]]と同じです。なぜなら、入力ファイルは、つねにWAVに復元(decompress)されるからです。詳しくは、またGetChannelを見てください。AviSynthは、8, 16, 24, 32ビットのint(整数)型PCMサンプル、およびfloat(浮動小数)型PCMフォーマット、そしてチャンネルはいくらでも読み込みます。

''video'' = true (v2.52から): これをfalseに設定すると、オーディオしか開くことができません。

''convertfps'' = false (v2.56から): フレームを追加することによって、可変フレームレート(vfr)のビデオを、固定フレームレート(cfr)のビデオにします。AviSynthでvfrビデオ(たとえば、混合フレームレートビデオ(hybrid video)のmkv, rmvb, mp4, asf または wmv)を開きたいときに、これは役に立ちます。fpsパラメータが、たとえば120や119.880のように、(クリップを)構成するvfrのレートの最小公倍数に設定されているときに、それはもっとも役に立ちます。

''seekzero'' = false (v2.56から): 開始点へシークすることを制限するためのオプション。インデックス化されていないASFファイルに対して、限られたシークを許可します。前方へのシークは、もちろん(すべてのサンプルを読み込むことによって)地道に実行されます。

''timeout'' = 60000 (ミリ秒単位。60000ミリ秒 = 1分) (v2.56から): DirectShowがレンダリングを拒否するときに待つ時間を設定します。正の値は、空のフレームと/または無音を返します。負の値を指定すると、実行時のAviSynthの例外を投げます。

''pixel_type'' (in v2.56): 結果として生じるクリップのピクセル・タイプ。"YV12", "YUY2", "ARGB", "RGB32", "RGB24", "YUV", "RGB" または "AUTO"から指定できます。これは、IPinネゴシエーション((訳者註: [[まるも製作所:http://www.marumo.ne.jp/index.htm]]の[[6月15日(水) DirectShow の仕組み [4]:http://www.marumo.ne.jp/db2005_6.htm#15]]を参照。))のために、受け入れ可能なビデオストリームのサブフォーマットを制限します。あなたのリクエストを満たすために、グラフビルダーがフォーマットコンバータを追加するかもしれないということに注意してください。そこで、用いられているコーデックが、実際に、選択されたフォーマットにデコードできることを確めてください。たぶんM$フォーマットコンバータで事足ります。"YUV"と"RGB"の偽型(pseudo-types)は、すべてのサポートされたYUVまたはRGBフォーマットへのネゴシエーションをそれぞれ制限します。

** 例 [#d7d1b5af]

AVIを最初に利用可能なRGBフォーマットで開く(音声なし):
#code(nonumber){{
DirectShowSource("F:\TestStreams\xvid.avi",fps=25, audio=false, pixel_type="RGB")
}}

DVクリップをMS DV デコーダで開く:
#code(nonumber){{
DirectShowSource("F:\DVCodecs\Analysis\Ced_dv.avi") # MS-DV
}}

フレームを追加することによって((ビデオとオーディオの)同期を確実にして)可変フレームレートのMKVを119.88fpsとして開く:
#code(nonumber){{
DirectShowSource("F:\Guides\Hybrid\vfr_startrek.mkv", fps=119.88, convertfps=true)
}}

RealMediaの*rmvbクリップを開く:
#code(nonumber){{
DirectShowSource("F:\test.rmvb", fps=24, convertfps=true)
}}

GraphEditファイルを開く:
#code(nonumber){{
DirectShowSource("F:\graph.grf")
}}

オーディオの例については、下記参照。

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

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

***"The Filter Graph won't talk to me" !!!(フィルタグラフが話かけてこないよ!!!) [#w9c9781c]

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

***The samplerate is wrong!(サンプリング周波数が不正!) [#s275812c]

いくつかのフィルタは、正しいサンプリング周波数を報告することに関して問題を抱えており、ファイルが実際に再生している時に、これを訂正するかもしれません。不幸なことに、いったんファイルが開かれてしまうと、AviSynthがこれを訂正する方法はありません。"AssumeSampleRate"を使って、正しいサンプリング周波数に設定し、この問題を修正してください。

***My sound is choppy(音声が途切れ途切れだ) [#dc8375c8]

不幸にも、Directshowは、サンプルの正確なシークをサポートすることを要求されません。音声を別の方法で開くか、ビデオファイルをdemux(分離)して、それを別の方法でAviSynthに供給(serve)してください。そのほかの方法では、パラメータとして"seekzero = true"か"seek = false"を明示するか、Directshowオーディオ・ストリームへのリニアアクセスを強制するためにEnsureVBRMP3Syncフィルタを使用することができます。

**コモン・タスク(Common tasks) [#jf61e7e0]

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

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

GraphEditのGRFファイルは、.grfというファイル名の拡張子によって自動的に検出され、DirectShowSourceによって読み込まれます。AviSynthがそれに接続できるようにするためには、AviSynthが接続できるメディア・タイプのピンを、GraphEditで開いた状態にしておかなければなりません。AviSynthは、どんなフィルタの接続も切ろうとはしないでしょう。そのため、出力タイプが正確であることが重要です。

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

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

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

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

次のスクリプトを作成します:

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

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

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

 regsvr32 ChannelDownmixer.ax 

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

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

次のスクリプトを作成します:

#code(nonumber){{
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は反抗的な(recalcitrant)グラフへの反応をコントロールする |
| | pixel_typeは出力ビデオのピクセルフォーマットを明示/制限する |

#hr
註: このページは、http://www.avisynth.org/DirectShowSourceの日本語訳です。

なお、[[にゃおでぃお - 音楽圧縮に関するウェブページ (旧 Vorbish: 気まぐれなVorbis追っかけ):http://nyaochi.sakura.ne.jp/xoops/]]で、DirectShowSourceフィルタプラグインに可変フレームレート(VFR)対応パッチをあてた[[DirectShowSource with ConvertFPS:http://nyaochi.sakura.ne.jp/xoops/modules/mydownloads/singlefile.php?cid=2&lid=3]]が公開されています([[参照>niiyan/2005-03-03#bc04a9f1]])。

(追記)~
上記のパッチは、v2.5.6(beta3以降)から、DirectShowSourceフィルタに取り込まれました。

> [[Doom9's Forum - AviSynth 2.5.6 CVS Pre-Releases. [May 6th]:http://forum.doom9.org/showthread.php?s=&postid=650235#post650235]]
> - Support for [vfr content in DSS]: DirectShowSource("F:\Guides\Hybrid\vfr_startrek.mkv", fps=119.88, convertfps=true) turns vfr into cfr stream by adding frames.