圧縮キャプチャ

前回かき集めたWebページを読書して、VoiceChatのエンジンとしての全体像が見えてきた。


前回のリンクの中に、
ChaiPhone
音声通話をするためのSIPクライアント(ソフトフォン)
てなサイトがあるのだが、その中に、Jave de RTP Javeでリアルタイム通信(RTP)を行う際のメモを見つけた。
RTPをJavaで実装した際のサンプルコードである。
この情報により、いままでぼんやりしていたRTPでのイメージがはっきりしてきた。
送信側
音声をキャプチャ
圧縮
RTPヘッダをつける
UDPに投げ込む
受信側
UDPからデータを拾う
展開
音声を再生
というのが基本となる流れ。
実際にはこれだけじゃ足らなくて、
受信側では、
適当なジッタ処理用のバッファを用意して、
UDPのパケットロスや遅延に備える。
UDPは順番めちゃめちゃで届くのでその順序をちゃんとする。
などの処理が必要。
そのほか、
通信回線の状況を監視して、回線が十分に速くて順序が調子いいようなら遅延バッファを小さくして遅延を減らしたり、逆に回線が遅いようなら、遅延バッファを大きくしたり、受信側から送信側に状況を知らせて、送信の方法(圧縮率とか?)を変えてみたり、
音声キャプチャの際に、自分のスピーカーからの音を拾わないようにエコー処理をしたり。
めんどくせぇ。
前回、

そいえば、DirectSoundで圧縮付でキャプチャしてくる機能があったな。

という記述をしたので、DirectSound周りのお勉強とその検証。
DirectSoundのヘルプ内にあるg. キャプチャ バッファのエフェクトという記述に、
DirectSoundのヘルプ内に、

* 聴感エコー解除 (AEC)
* ノイズ抑制

てな記述を発見。エコーとノイズはこいつが使える。こいつは、もともと音声チャット用の機能らしい。XPじゃないと動かないってさ。うーん微妙。
同じく、DirectSoundのヘルプ内4. ウェーブフォームのキャプチャ

データは、パルス コード変調 (PCM) または圧縮フォーマットでキャプチャできる。

って書いてある。やっぱりできんじゃん。
ということで、DirectSoundのサンプルコードの中に、サウンドカードから音をキャプチャしてくるやつがあるので、こいつをもとに、ちょいちょいっと変更して圧縮フォーマットでキャプチャを目指す。
横着なのでC#のサンプルコードを使う。
キャプチャバッファの作成の際に渡す、CaptureBufferDescription構造体のFormatメンバが、WaveFormat構造体で、こいつには普通、WaveFormatTag.Pcmてな値を(C#からだと)渡す。
こいつを、ちょいちょいっと変更してって、WaveFormatTag、Pcmしかないじゃん。
だめじゃん。
こうゆうときは、C++の方のサンプルを見る。

g_wfxInput.wFormatTag = WAVE_FORMAT_PCM;

そそ。これこれ。他にどんなんがあるのかなぁ。ってヘルプを調べるも、なんも情報が無い。使えねぇ。こうゆうときは、ヘッダファイル。WAVE_FORMAT_PCMで検索かけて、定義している場所を探すと。

Microsoft DirectX 9.0 SDK (December 2004)Includeksmedia.h(642): DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_PCM)
Microsoft Visual Studio .NET 2003Vc7PlatformSDKIncludeKsMedia.h(642): DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_PCM)
Microsoft Visual Studio .NET 2003Vc7PlatformSDKIncludeMMReg.h(2243):#ifndef WAVE_FORMAT_PCM
Microsoft Visual Studio .NET 2003Vc7PlatformSDKIncludeMMReg.h(2258):#define WAVE_FORMAT_PCM 1
Microsoft Visual Studio .NET 2003Vc7PlatformSDKIncludeMMReg.h(2269):#endif /* WAVE_FORMAT_PCM */
Microsoft Visual Studio .NET 2003Vc7PlatformSDKIncludeMMSystem.h(764):#ifndef WAVE_FORMAT_PCM
Microsoft Visual Studio .NET 2003Vc7PlatformSDKIncludeMMSystem.h(776):#define WAVE_FORMAT_PCM 1
Microsoft Visual Studio .NET 2003Vc7PlatformSDKIncludeMMSystem.h(784):#endif /* WAVE_FORMAT_PCM */
Microsoft Visual Studio .NET 2003Vc7PlatformSDKIncludeMSAcm.h(591):// converter compresses WAVE_FORMAT_PCM to WAVE_FORMAT_ADPCM, then this bit

とりあえず、最後の行に、WAVE_FORMAT_ADPCMてな記述があるのでこいつを採用。
うごかねぇ。
生意気にNOTIMPLを返しやがる。
ということで、Googleで検索するも、生PCMでのキャプチャに関する文章しか出てこない。ったく、もう。使えねぇ。
なんとなく、やり方間違ってる気がする。
頭冷やして出直してきます。
自前で圧縮エンジン書いてもいいんだけど、それじゃぁ頭悪いよな。
というか、このまま行くと、ほとんどソフトウエアで実装することになっちゃう。
車輪の再発明。
あんまり賢くないなぁ。
というか、個人でやる規模を超えちゃうし。

コメントを残す