TGWS>プログラミング>

VBでDirectShow

難しそうだと思って何年間もずっとずーーーっと避けてきたんですがね。
実際に使ってみると拍子抜けするくらいあっけなくて。

C++用のリファレンスを読むべし

VB用のDirectXリファレンスを見てもどこにもDirectShowに関する記述が見つからないんですよね。
なんでかなーと思っていると、DirectX8のC++用のリファレンスに書いてありました。
あったら読んでおきましょう。

参照設定

VBでDirectXを使うときは参照設定でしかるべき項目をチェックするのですが、DirectShowの場合はquartz.dll、つまり、「ActiveMovie control type library」とかいうのにチェックを入れます。
Directなんちゃらとかいうのは参照設定しなくていいみたいです。

再生するのだ

リファレンスに書いてあるのとそう変わらんのでさらっと流します。

Dim MediaControl As IMediaControl

Set MediaControl = New FilgraphManager
MediaControl.RenderFile FileName
MediaControl.Run

ちなみにこれ、経験上、別のファイルを再生するときは前のファイルをStopするのはもちろんのこと、Set MediaControl = New FilgraphManager も改めてやっておかなければいけないみたいです。

音量調整

IBasicAudioにさっきのIMediaControlを代入して使うみたいです。

Dim BasicAudio As IBasicAudio

Set BasicAudio = MediaControl
If Volume > 0 Then BasicAudio.volume = 1000 * Log(Volume / 100#) / Log(10#) Else BasicAudio.volume = -10000

-10000(無音)~0(普通)の間で変化させるのですが、この値を変化させると音の振幅は1000ごとに10分の1と指数関数的に減少するので、振幅を元のデータの百分率で表すときは対数でボリュームを指定してやります。

再生位置

頭出しとかに使えそうですな。

Dim MediaPosition As IMediaPosition

Set MediaPosition = MediaControl
MediaPosition.CurrentPosition = Position

これは100ナノ秒の精度を持ちますが100ナノ秒単位ではなく秒単位ですので気をつけましょう。
ドキュメントを深読みして1000万倍のデータをぶち込んだ馬鹿がここにいます。

…とまあ、このあたりですな。
サンプルは用意してませんが「自分にとって使いやすく」を重視して作っている「NeoMupl」の開発中のソースが参考になるかもしれません。