人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: haru-s
●カテゴリ:コンピュータ
✍キーワード:Windows チャンネル デバイス ビットレート フォーマット
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● windofiuly
●20ポイント

8bitだよ

http://q.hatena.ne.jp/1290619173

◎質問者からの返答

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


2 ● mj99
●50ポイント ベストアンサー

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

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ