Windowsのwavein/waveout系関数を使って録音再生をするプログラムを作っています.

WaveFormatExで指定できる音声フォーマットとwaveInGetDevCapsで取得できるデバイス性能の関係がわからなくて困っています.
waveInGetDevCapsが「ビットレートが16bitsの入力デバイス」と返してきたときに,
WaveFormatExで8bitsのビットレートで録音する指定をしても問題なく録音できていますが,
これは実際にはどちらの値で録音されているのでしょうか?
性能が16bitsなら,16bits以下である8bitsの指定が可能であるということでしょうか.
同様にビットレートでなくチャンネル数についてはどうなのでしょうか.

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/11/25 02:19:37
  • 終了:2010/11/29 17:41:24

ベストアンサー

id:mj99 No.2

mj99回答回数138ベストアンサー獲得回数382010/11/26 18:16:37

ポイント50pt

まずは、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

id:haru-s

なるほど,よく分かりました.

言葉の使い方が不正確でしたね.すいません.

ありがとうございました.

2010/11/26 18:40:14

その他の回答(1件)

id:windofiuly No.1

windofiuly回答回数62ベストアンサー獲得回数22010/11/25 07:28:03

id:haru-s

ありがとうございました.

2010/11/26 18:34:03
id:mj99 No.2

mj99回答回数138ベストアンサー獲得回数382010/11/26 18:16:37ここでベストアンサー

ポイント50pt

まずは、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

id:haru-s

なるほど,よく分かりました.

言葉の使い方が不正確でしたね.すいません.

ありがとうございました.

2010/11/26 18:40:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません