WaveFormatExで指定できる音声フォーマットとwaveInGetDevCapsで取得できるデバイス性能の関係がわからなくて困っています.
waveInGetDevCapsが「ビットレートが16bitsの入力デバイス」と返してきたときに,
WaveFormatExで8bitsのビットレートで録音する指定をしても問題なく録音できていますが,
これは実際にはどちらの値で録音されているのでしょうか?
性能が16bitsなら,16bits以下である8bitsの指定が可能であるということでしょうか.
同様にビットレートでなくチャンネル数についてはどうなのでしょうか.
まずは、WAVEINCAPSの内容を少し説明。。。
WAVEINCAPS::dwFormatsは下記の定数です。
(MMSystem.hから抜粋)
/* defines for dwFormat field of WAVEINCAPS and WAVEOUTCAPS */ #define WAVE_INVALIDFORMAT 0x00000000 /* invalid format */ #define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */ #define WAVE_FORMAT_1S08 0x00000002 /* 11.025 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_1M16 0x00000004 /* 11.025 kHz, Mono, 16-bit */ #define WAVE_FORMAT_1S16 0x00000008 /* 11.025 kHz, Stereo, 16-bit */ #define WAVE_FORMAT_2M08 0x00000010 /* 22.05 kHz, Mono, 8-bit */ #define WAVE_FORMAT_2S08 0x00000020 /* 22.05 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_2M16 0x00000040 /* 22.05 kHz, Mono, 16-bit */ #define WAVE_FORMAT_2S16 0x00000080 /* 22.05 kHz, Stereo, 16-bit */ #define WAVE_FORMAT_4M08 0x00000100 /* 44.1 kHz, Mono, 8-bit */ #define WAVE_FORMAT_4S08 0x00000200 /* 44.1 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_4M16 0x00000400 /* 44.1 kHz, Mono, 16-bit */ #define WAVE_FORMAT_4S16 0x00000800 /* 44.1 kHz, Stereo, 16-bit */ #define WAVE_FORMAT_48M08 0x00001000 /* 48 kHz, Mono, 8-bit */ #define WAVE_FORMAT_48S08 0x00002000 /* 48 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_48M16 0x00004000 /* 48 kHz, Mono, 16-bit */ #define WAVE_FORMAT_48S16 0x00008000 /* 48 kHz, Stereo, 16-bit */ #define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */ #define WAVE_FORMAT_96S08 0x00020000 /* 96 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_96M16 0x00040000 /* 96 kHz, Mono, 16-bit */ #define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */
waveInGetDevCapsは、そのデバイスがサポートする性能の論理和(合計値)を返します。
例えば、WAVE_FORMAT_1M08とWAVE_FORMAT_1S08をサポートするなら、0x00000003が返されます。
経験的に、ほとんどの場合、0x0000FFFFが返されます。Vista以降はどんなPCでも0x0000FFFFになってた気がします。
(ようするに、44.1kHz以下の全パターンをサポートしていると思ってよいかと思います。。。。)
定数1つで、3つの要素を表しています。
・サンプリングレート ・・・ 11.025kHz、22.05kHz、44.1kHz、48kHz、96kHz、のどれか
・チャンネル数 ・・・ モノラル(Mono)、ステレオ(Stereo)、のどちらか
・量子化ビット ・・・ 8bit、16bit、のどちらか
WAVEINCAPS::wChannelsは、デバイスによって意味が異なるようです。
経験的に、ほとんどの場合、0x0000か、0xFFFFになってた気がします。
(0x0000=モノラル/0xFFFF=ステレオのような気もします)
----
次に、WAVEFORMAT構造体との関係について。。。
WAVEFORMAT::wChannels ・・・ チャンネル数
⇒設定値:1か2(モノラルかステレオ)
WAVEFORMAT::dwSamplesPerSec ・・・ サンプリングレート
⇒設定値:11025、22050、など(11.025kHz、22.05kHz、などを5桁整数で)
WAVEFORMAT::wBitsPerSample ・・・ 量子化ビット
⇒設定値:8か16(8bitか16bit)
waveInGetDevCapsから得た情報を元に、指定できる値を決められると思います。
---
なお、「ビットレート」とは、一般的に、bpsと言う単位で表し、
「1秒あたりのビット数」のことです。AVに限らず、様々な場面で使われます。
AVでは、デジタルAV情報を符号化≒圧縮化(mp3,wma,mpg,wmvなど)した場合の「1秒あたりのビット数」を指します。
そして、WAVEINCAPS::dwFormatsが示す「量子化ビット」とは、
「サンプリング量子あたりのビット数」のことです。
http://msdn.microsoft.com/ja-jp/library/bb669161(VS.85).aspx
まずは、WAVEINCAPSの内容を少し説明。。。
WAVEINCAPS::dwFormatsは下記の定数です。
(MMSystem.hから抜粋)
/* defines for dwFormat field of WAVEINCAPS and WAVEOUTCAPS */ #define WAVE_INVALIDFORMAT 0x00000000 /* invalid format */ #define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */ #define WAVE_FORMAT_1S08 0x00000002 /* 11.025 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_1M16 0x00000004 /* 11.025 kHz, Mono, 16-bit */ #define WAVE_FORMAT_1S16 0x00000008 /* 11.025 kHz, Stereo, 16-bit */ #define WAVE_FORMAT_2M08 0x00000010 /* 22.05 kHz, Mono, 8-bit */ #define WAVE_FORMAT_2S08 0x00000020 /* 22.05 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_2M16 0x00000040 /* 22.05 kHz, Mono, 16-bit */ #define WAVE_FORMAT_2S16 0x00000080 /* 22.05 kHz, Stereo, 16-bit */ #define WAVE_FORMAT_4M08 0x00000100 /* 44.1 kHz, Mono, 8-bit */ #define WAVE_FORMAT_4S08 0x00000200 /* 44.1 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_4M16 0x00000400 /* 44.1 kHz, Mono, 16-bit */ #define WAVE_FORMAT_4S16 0x00000800 /* 44.1 kHz, Stereo, 16-bit */ #define WAVE_FORMAT_48M08 0x00001000 /* 48 kHz, Mono, 8-bit */ #define WAVE_FORMAT_48S08 0x00002000 /* 48 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_48M16 0x00004000 /* 48 kHz, Mono, 16-bit */ #define WAVE_FORMAT_48S16 0x00008000 /* 48 kHz, Stereo, 16-bit */ #define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */ #define WAVE_FORMAT_96S08 0x00020000 /* 96 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_96M16 0x00040000 /* 96 kHz, Mono, 16-bit */ #define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */
waveInGetDevCapsは、そのデバイスがサポートする性能の論理和(合計値)を返します。
例えば、WAVE_FORMAT_1M08とWAVE_FORMAT_1S08をサポートするなら、0x00000003が返されます。
経験的に、ほとんどの場合、0x0000FFFFが返されます。Vista以降はどんなPCでも0x0000FFFFになってた気がします。
(ようするに、44.1kHz以下の全パターンをサポートしていると思ってよいかと思います。。。。)
定数1つで、3つの要素を表しています。
・サンプリングレート ・・・ 11.025kHz、22.05kHz、44.1kHz、48kHz、96kHz、のどれか
・チャンネル数 ・・・ モノラル(Mono)、ステレオ(Stereo)、のどちらか
・量子化ビット ・・・ 8bit、16bit、のどちらか
WAVEINCAPS::wChannelsは、デバイスによって意味が異なるようです。
経験的に、ほとんどの場合、0x0000か、0xFFFFになってた気がします。
(0x0000=モノラル/0xFFFF=ステレオのような気もします)
----
次に、WAVEFORMAT構造体との関係について。。。
WAVEFORMAT::wChannels ・・・ チャンネル数
⇒設定値:1か2(モノラルかステレオ)
WAVEFORMAT::dwSamplesPerSec ・・・ サンプリングレート
⇒設定値:11025、22050、など(11.025kHz、22.05kHz、などを5桁整数で)
WAVEFORMAT::wBitsPerSample ・・・ 量子化ビット
⇒設定値:8か16(8bitか16bit)
waveInGetDevCapsから得た情報を元に、指定できる値を決められると思います。
---
なお、「ビットレート」とは、一般的に、bpsと言う単位で表し、
「1秒あたりのビット数」のことです。AVに限らず、様々な場面で使われます。
AVでは、デジタルAV情報を符号化≒圧縮化(mp3,wma,mpg,wmvなど)した場合の「1秒あたりのビット数」を指します。
そして、WAVEINCAPS::dwFormatsが示す「量子化ビット」とは、
「サンプリング量子あたりのビット数」のことです。
http://msdn.microsoft.com/ja-jp/library/bb669161(VS.85).aspx
なるほど,よく分かりました.
言葉の使い方が不正確でしたね.すいません.
ありがとうございました.
なるほど,よく分かりました.
言葉の使い方が不正確でしたね.すいません.
ありがとうございました.