DirectShow と Windows Media Encoder SDK でビデオデバイス共有とかメモ

今回、途中まで新しく小さなものを作っていたのだけど、その制作の技術的なメモ。

毎度毎度、制作のたびにTVのチューナーを買うのが面倒なので、たとえば、LANの中で、テレビの映像と音声を共有できると、楽だよな〜ということでさっそく考えてみた。(TVのチューナーに限らずとも、LAN内のコンピュータAからコンピュータBに接続されたWEBカムの映像を取得する方法と考えてもおk)

方法としてはとても簡単で、チューナーやカメラなどのビデオデバイスが接続されたコンピュータをストリーミング配信サーバーにして、ビデオデバイスの映像と音声をプル型で配信する。そして、そのコンピュータにLAN内(グローバルIPがあればLAN外でもいいけど)の別のコンピュータからアクセスして、DirectShowでストリーミングデータを取得してグラフを構築するというもの。

一番お手軽なのは、配信サーバーとなるコンピュータにWindows Media Encoder(WME)とかVNCとかを入れてプル型の配信サーバーに仕立てるというものだけど、自分の用途としては、少なくとも7つのチューナーの映像・音声を同時に配信する必要があったため、Windows Media Encoder SDKをつかってカスタマイズされたアプリケーションを作った。

作るには、SDKに添付されているヘルプにのっている情報が一番有益なので、とくに無いんですけど、WME SDK(とWME)の困ったところは、自分が使っている「Dual-TV」のような、独自のサウンドデバイスドライバを持たず、そのデバイスが使用しているPCI経由でサウンドを出力するタイプのデバイスには対応していないという点。つまり、自分の場合、映像は配信できても、音は配信できないという。

それで、考えたのは、WMEはこの際あきらめて、おなじくプル型の配信に対応したWindows Media Format SDKをDirectShowと組み合わせて使うというもの。しかし、こいつは全世界に使用している人間が異様に少ないばかりか、添付のヘルプファイルにもサンプルコードがほぼ皆無という鬼畜なSDKなので(無論ヘルプファイルは全て英語)、理解するのに非常な困難が伴う。結局、ストリーミング用のポートを開くところまではこぎ着けたが、デバイスが吐き出す映像のバッファや、音声のバッファをうまいこと書き出すに至れず、あえなくそこでタイムアウトとなった。

というわけで現在は、映像はWMEで配信し、音声は非圧縮でUDPで配信するというコードを書いている。なんか激しく非効率なんだけど、動けばいいよね。(というか、よほどのことが無い限りWME+DirectShowで十分だと思うので、「なんでOSCで映像や音声のデータ飛ばせねーんだよクソが」とお門違いな怒りを発散させている情報芸術コースの学生諸君はWME SDKとDirectShowを使ってみるべきだと思う。)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>