パソコンが再生している音楽を録音

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#16 投稿記事 by yu0627 »

> > 教えてくださりありがとうございます。動作確認できました。
> > これからは色々と自分で試行錯誤してみます。もし乗り越えれない壁に当たったらまた返信するかもしれません。
> > ちなみに僕の環境で44100KHz 16bit Stereoで録音するとやばくなります。再生速度が遅いというか...。
>
>
> たぶんバッファサイズを大きくとれば改善するでしょう。
> このサンプルでは1*1024bitいわゆる1Kbyteですが
> 6K~8K位に増やせばCPUの遅いパソコンでも大丈夫だと思います。

ありがとうございます。5KBにバッファを増やしたらうまく動くようになりました。
WinXP Home SP2
AMD AthlonXP 1700+ (1.46GHz)
384MB
↑この環境でもこうなりました...。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

[最重要]

#17 投稿記事 by NoWest »

久しぶりにWAVE関連のプログラムを弄っていたら
私の書き込んだソースに欠陥を発見しました。

このソースを使ってプログラムを作っていた方は修正してください。


修正箇所はウィンドウのDESTROYイベント内にあります。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: [最重要]

#18 投稿記事 by NoWest »

さらに修正箇所が見つかりました。
といっても修正した同じ場所に間違いがありました。

Record_Flagについての条件分岐がなされていませんでしたが、
すでに編集で上のコードは修正してあります。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#19 投稿記事 by yu0627 »

 久しぶりに、NoWestさんの録音コードを使ったソフトをActiveBasic v4.20.00でコンパイルしました。
そして、音質の高いモードで録音したら、録音ファイルがWindows Media Player 10(以下WMP10)で再生できません。
そこで、「WAVE録音と再生のサンプル」も再コンパイルしました。
しかし、低音質ではWMP10で再生できるのですが、高音質では再生することはできません。
バッファは5*1024、5KBにしてあります。
iTunesやQuickTimeでは再生できます。
また、ActiveBasicオフィシャルユーザーズガイドの第9章のSoundPlayerではしっかりと再生できます。
ただし、RealPlayerでは遅く再生されます。
僕の環境だけの現象かもしれませんが、どうなんでしょうか。
WMP10では、なぜかコーデックをダウンロードしようとします。その機能をはずすと、再生できません。

参考・・・録音ファイルのプロパティ
ビットレート:362kbps
オーディオサンプルサイズ:16bit
チャンネル:2(ステレオ)
オーディオサンプルレート:44KHz
オーディオ形式:PCM
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

Re: 返信@yu0627

#20 投稿記事 by Mario2 »

> 参考・・・録音ファイルのプロパティ
> ビットレート:362kbps
> オーディオサンプルサイズ:16bit
> チャンネル:2(ステレオ)
> オーディオサンプルレート:44KHz
> オーディオ形式:PCM
一度ビットレートを320kbpsとか192kbpsに下げてみてはどうでしょう?
一般的な録音ソフトや変換ソフトでは確か320kbpsが最大ビットレートだったと思いまして・・・
一般的には、192kbps以上は人間の耳ではほとんど違いが分かりにくいみたいですけど、真相は不明です^^;
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#21 投稿記事 by yu0627 »

 一体どの周波数・ビット・チャンネルでどんなビットレートになるのか調べて見ました^^;

11025kHz 8bit モノラル・・・ 88kbps
11025kHz 8bit ステレオ・・・176kbps
11025kHz 16bit モノラル・・・176kbps
11025kHz 16bit ステレオ・・・352kbps
22050kHz 8bit モノラル・・・176kbps
22050kHz 8bit ステレオ・・・352kbps
22050kHz 16bit モノラル・・・352kbps
22050kHz 16bit ステレオ・・・181kbps(WMP10再生不可)
44100kHz 8bit モノラル・・・352kbps
44100kHz 8bit ステレオ・・・181kbps(WMP10再生不可)
44100kHz 16bit モノラル・・・181kbps(WMP10再生不可)
44100kHz 16bit ステレオ・・・362kbps(WMP10再生不可)

 僕の環境では以上のようになりました。皆さんの環境ではどうなるか分かりませんが。
 ビットレートの取得はエクスプローラのプロパティ→概要タブの部分にしています。
 一度、X-CLEANERを使ったので、それが誤除去したのかと思いシステムの復元をしましたが変化なしです。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 返信@yu0627

#22 投稿記事 by NoWest »

>  一体どの周波数・ビット・チャンネルでどんなビットレートになるのか調べて見ました^^;
>
> 11025kHz 8bit モノラル・・・ 88kbps
> 11025kHz 8bit ステレオ・・・176kbps
> 11025kHz 16bit モノラル・・・176kbps
> 11025kHz 16bit ステレオ・・・352kbps
> 22050kHz 8bit モノラル・・・176kbps
> 22050kHz 8bit ステレオ・・・352kbps
> 22050kHz 16bit モノラル・・・352kbps
> 22050kHz 16bit ステレオ・・・181kbps(WMP10再生不可)
> 44100kHz 8bit モノラル・・・352kbps
> 44100kHz 8bit ステレオ・・・181kbps(WMP10再生不可)
> 44100kHz 16bit モノラル・・・181kbps(WMP10再生不可)
> 44100kHz 16bit ステレオ・・・362kbps(WMP10再生不可)
>
>  僕の環境では以上のようになりました。皆さんの環境ではどうなるか分かりませんが。
>  ビットレートの取得はエクスプローラのプロパティ→概要タブの部分にしています。
>  一度、X-CLEANERを使ったので、それが誤除去したのかと思いシステムの復元をしましたが変化なしです。
この件なのですが、うちのPCでも同じことが起こっています。
しかしながら、私のプログラムはちゃんと規格を守っているので、”一般的なサウンドツール”では再生されないはずはありません。

おそらくですが、生のWAVEデータにWMPのデコーダが対応していないのではないでしょうか?

こちらではWindows付属のサウンドレコーダーでの再生は確認しています。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 原因判明@NoWest

#23 投稿記事 by NoWest »

原因が分かりました。

WaveInFormatEx.nAvgBytesPerSecメンバの計算箇所で
DWordで計算されるべきところがWordで計算されていたのが原因です。

コード: 全て選択

WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign As DWord * WaveInFormatEx.nSamplesPerSec

nBlockAlignメンバはWordなので計算した結果がWord値になっていたんですね。
道理でサンプリング周波数が小さいのが正常で大きいのがエラーになるわけです。


P.S.
バグを直したつもりだったんですが新たなバグを見付けてしまいました。
時間があれば、このサンプルは作り直してコード投稿の方にでも出します。

P.S.2
あっても無くても動くんですが、C++で構造体サイズを調べたところ
WAVEFORMATとPCMWAVEFORMAT、WAVEFORMATEXは
Type Align(1) ~~
End Type
のようにしないといけないようです。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#24 投稿記事 by yu0627 »

> 原因が分かりました。
>
> WaveInFormatEx.nAvgBytesPerSecメンバの計算箇所で
> DWordで計算されるべきところがWordで計算されていたのが原因です。
>
>

コード: 全て選択

WaveInFormatEx.nAvgBytesPerSec = WaveInFormatEx.nBlockAlign As DWord * WaveInFormatEx.nSamplesPerSec
> 
>
>
> nBlockAlignメンバはWordなので計算した結果がWord値になっていたんですね。
> 道理でサンプリング周波数が小さいのが正常で大きいのがエラーになるわけです。
 こちらでも改善確認いたしました。変換したファイルを見ると、
1411kbps 44100Hz 16bit ステレオ
と、なっており、しっかりとWMP10で再生できるようになりました。ありがとうございます。

> P.S.2
> あっても無くても動くんですが、C++で構造体サイズを調べたところ
> WAVEFORMATとPCMWAVEFORMAT、WAVEFORMATEXは
> Type Align(1) ~~
> End Type
> のようにしないといけないようです。
 この点については、僕はまだ分かりません^^;
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

またまた問題発生

#25 投稿記事 by yu0627 »

 またまた、このコードで問題が発生しました。
久しぶりに、AB4.24.00にて該当するコードを含んだプログラムをコンパイルし録音すると、
48バイト以上のデータが書き込まれません。サウンドのビットレートなどについては、OKです。
デバッグしてみたところ、ウインドウメッセージのコールバック関数内の、「WAVE入力デバイスのバッファが一杯になった時に呼ばれる」の
「dataデータを書き込み」の「mmioWrite(hMmio,pwh->lpData,pwh->dwBytesRecorded)」でなぜかアクセス違反がおきました。
なお、なぜかサンプルプログラムではうまくいって、それを組み込んだプログラムではうまくいきません。
やっぱり僕が作ったプログラムに問題があるのでしょうか。
参考までに、組み込みプログラム(MIDI Encorder)のソースを全部載せます。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

なぜか問題解決

#26 投稿記事 by yu0627 »

 色々やっていたところ、どうやら、バッファサイズを大きくしすぎていたようでした。
バッファ数5で32*2^10バイト以上のバッファサイズを確保すると録音データが書き込まれなくなるようです。
なんででしょうかねぇ...。
お騒がせいたしました^^;
返信する