Managed DirectSoundを使ってマイクから音声を録音してみる1

chakemiです。 今日は、DirectSoundを使ってマイクから音声を録音に挑戦してみましたが、オーディオのキャプチャがうまくできませんでした。。。(T T)

開発環境

  • WindowsXP SP3
  • VisualC#2010Express

DirectSoundを使ってマイクからの入力を録音するには、基本的には、waveファイルを再生と逆をやればいいはずと踏んでます。

ざっくりと流れだけ纏まると、まずは、WaveFormatを生成する。

1
2
3
4
5
6
7
waveFormat = new WaveFormat();
waveFormat.Channels = 1;
waveFormat.FormatTag = WaveFormatTag.Pcm;
waveFormat.BitsPerSample = 16;
waveFormat.SamplesPerSecond = 44100;
waveFormat.BlockAlign = (short)(waveFormat.Channels * (waveFormat.BitsPerSample / (short)8));
waveFormat.AverageBytesPerSecond = waveFormat.BlockAlign * waveFormat.SamplesPerSecond;

次に、Device情報から、Captureオブジェクトの作成。

1
2
3
4
5
device = new Device();
device.SetCooperativeLevel(this, CooperativeLevel.Priority);
captureDevice = new CaptureDevicesCollection();
DeviceInformation deviceInfo = captureDevice[1];
capture = new Capture(deviceInfo.DriverGuid);

captureBufferDescription構造体に必要な情報を入力する。

1
2
3
4
5
captureBufferDescription = new CaptureBufferDescription();
captureBufferDescription.BufferBytes = waveFormat.AverageBytesPerSecond / 5;
captureBufferDescription.WaveMapped = false;
captureBufferDescription.ControlEffects = false;
captureBufferDescription.Format = waveFormat;

RIFF形式のヘッダ情報を書き込んで、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
BinaryWriter binaryWriter = new BinaryWriter(new FileStream(@"C:\test_ds_rec.wav", FileMode.Create));

char[] Riff = { 'R', 'I', 'F', 'F' };
char[] Wave = { 'W', 'A', 'V', 'E' };
char[] Fmt = { 'f', 'm', 't', ' ' };
char[] Data = { 'd', 'a', 't', 'a' };
short padding = 1;
int formatLength = 0x10;
int length = 0;
short shBytePerSample = 2;

binaryWriter.Write(Riff);
binaryWriter.Write(length);
binaryWriter.Write(Wave);
binaryWriter.Write(Fmt);
binaryWriter.Write(formatLength);
binaryWriter.Write(padding);
binaryWriter.Write(waveFormat.Channels);
binaryWriter.Write(waveFormat.SamplesPerSecond);
binaryWriter.Write(waveFormat.AverageBytesPerSecond);
binaryWriter.Write(shBytePerSample);
binaryWriter.Write(waveFormat.BitsPerSample);
binaryWriter.Write(Data);
binaryWriter.Write((int)0);

別スレッドを立ち上げて、CaptureBuffer.Readでストリームバッファを 書き込み続ければいけるんじゃないかって感じで、今この辺です。。。

グダグダですみません。 次回までに、完成させたいと思います。

Comments