おすすめ
BookReport

MovieReport

ShowReport

Cook

Travel

NationalPark

Cancun

Casino

Camera

WindowsLiveWriter

LegoMindStormsNXT

LegoEnzoFerrari

WSH

Resume

お願い
Cagylogicサイトの内容に、いかなる保障もいたしません。またアクセスすることによるすべての損害等の責任を負いかねます。ご意見、ご要望、ご質問、不具合(バグ)報告等はコメント欄にてお願いします。リンクはご自由にどうぞ。
月別

« (前の日) シダ植物の分割 | メイン | 卵黄の味噌漬の結果 (次の日) »

« SIPとRTP | 分野 (VoiceChat) | HDがとんだ »

2005年5月15日

圧縮キャプチャ

前回かき集めた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)\Include\ksmedia.h(642): DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_PCM) \Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\KsMedia.h(642): DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_PCM) \Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\MMReg.h(2243):#ifndef WAVE_FORMAT_PCM \Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\MMReg.h(2258):#define WAVE_FORMAT_PCM 1 \Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\MMReg.h(2269):#endif /* WAVE_FORMAT_PCM */ \Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\MMSystem.h(764):#ifndef WAVE_FORMAT_PCM \Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\MMSystem.h(776):#define WAVE_FORMAT_PCM 1 \Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\MMSystem.h(784):#endif /* WAVE_FORMAT_PCM */ \Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\MSAcm.h(591):// converter compresses WAVE_FORMAT_PCM to WAVE_FORMAT_ADPCM, then this bit
とりあえず、最後の行に、WAVE_FORMAT_ADPCMてな記述があるのでこいつを採用。

うごかねぇ。
生意気にNOTIMPLを返しやがる。
ということで、Googleで検索するも、生PCMでのキャプチャに関する文章しか出てこない。ったく、もう。使えねぇ。

なんとなく、やり方間違ってる気がする。

頭冷やして出直してきます。

自前で圧縮エンジン書いてもいいんだけど、それじゃぁ頭悪いよな。

というか、このまま行くと、ほとんどソフトウエアで実装することになっちゃう。
車輪の再発明。

あんまり賢くないなぁ。
というか、個人でやる規模を超えちゃうし。

« (前の日) シダ植物の分割 | メイン | 卵黄の味噌漬の結果 (次の日) »

« SIPとRTP | 分野 (VoiceChat) | HDがとんだ »

コメントを投稿

« (前の日) シダ植物の分割 | メイン | 卵黄の味噌漬の結果 (次の日) »

« SIPとRTP | 分野 (VoiceChat) | HDがとんだ »

2008年11月
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
 
最近のつぶやき
Powered by