16ビットのリアルタイム録音→WAVファイル化が不調! – プログラミング – Home

16ビットのリアルタイム録音→WAVフ...
 
通知
すべてクリア

16ビットのリアルタイム録音→WAVファイル化が不調!


きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

リアルタイムで、量子化ビット数を16ビットでの取り込み設定にして、
そnデータをやはり16ビットでのWAVファイルに
保存したいのですが、
wfx.nChannels
wfx.nSamplesPerSec
wfx.wFormatTag
wfx.wBitsPerSample
wfx.nBlockAlign
wfx.wBitsPerSample
wfx.nBlockAlign
wfx.nAvgBytesPerSec =
wfx.cbSize
PLAYBACK_BUFFER_SIZE
DATABLOCK_SIZE
等の設定は、どうすればいいのでしょうか?
WAVファイルの16ビット設定の仕方は知っているのですが、
wfxの設定で、どうやっても、うまくいきません。
(一部は、再生できる感じですが、部分的に無音になったり、
 振幅=0のところが、持ち上がったり)
データでバイトで取り込んだ後、なんらかの変換を加えないといけないのか、
とか思ったり。


引用解決済
トピックタグ
siro_phys
 siro_phys
(@siro_phys)
ゲスト
結合: 17年前
投稿: 2
 

#define INP_BUFFER_SIZE 4410 //0.1 秒
#define Sample 22050
WAVEFORMATEX waveform ;
PWAVEHDR pWaveHdr1, pWaveHdr2 ;

pWaveHdr1 = malloc (sizeof (WAVEHDR)) ;
pWaveHdr2 = malloc (sizeof (WAVEHDR)) ;

waveform.wFormatTag = WAVE_FORMAT_PCM ;
waveform.nChannels = 1 ;
waveform.nSamplesPerSec = Sample;
waveform.nAvgBytesPerSec = 2*Sample ;
waveform.nBlockAlign = 2 ;
waveform.wBitsPerSample = 16 ;
waveform.cbSize = 0 ;

pWaveHdr1->lpData = (char *)pBuffer1 ;
pWaveHdr1->dwBufferLength = INP_BUFFER_SIZE ;
pWaveHdr1->dwBytesRecorded = 0 ;
pWaveHdr1->dwUser = 0 ;
pWaveHdr1->dwFlags = 0 ;
pWaveHdr1->dwLoops = 1 ;
pWaveHdr1->lpNext = NULL ;
pWaveHdr1->reserved = 0 ;

pWaveHdr2->lpData = (char *)pBuffer2 ;
pWaveHdr2->dwBufferLength = INP_BUFFER_SIZE ;
pWaveHdr2->dwBytesRecorded = 0 ;
pWaveHdr2->dwUser = 0 ;
pWaveHdr2->dwFlags = 0 ;
pWaveHdr2->dwLoops = 1 ;
pWaveHdr2->lpNext = NULL ;
pWaveHdr2->reserved = 0 ;

8bitでの録音再生からは一部の変更だけでできます


返信引用
きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

ありがとうございます。
確かに、おっしゃるとおりやってみたら、再生できました。

ところで、fputcでリアルタイム録音で拾った値を書いていくと
なぜか、for分でデータ数を規定しているにもかかわらず、
1000バイトほど多めに書きすぎる現象がおきるのですが、
なぜだかわかりますか?


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

>ところで、fputcでリアルタイム録音で拾った値を書いていくと
>なぜか、for分でデータ数を規定しているにもかかわらず、
>1000バイトほど多めに書きすぎる現象がおきるのですが、
>なぜだかわかりますか?

fopenでバイナリモードで開いてますか?
テキストモードだと改行コードの変換が入ると思いますが。

# ある程度まとめてfwriteで書き出した方が見通しいいかと。
# fputcでもバッファリングされてるとは思いますが。


返信引用
siro_phys
 siro_phys
(@siro_phys)
ゲスト
結合: 17年前
投稿: 8
 

録音している最中、バッファーにはデータがたまり続けているため
規定数カウントし終わった瞬間にもデータがバッファーに入ってしまうのではないでし
ょうか?
確認してみようと思います


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

一時メモリーに溜め込んでSleep()等で100mS位(時間は確認してください)待ってから
一度にファイルに書込むことは出来ないですか?


返信引用
siro_phys
 siro_phys
(@siro_phys)
ゲスト
結合: 17年前
投稿: 8
 

確認結果
case MM_WIM_DATA:
.
.
if(dwDataLength>=INP_BUFFER_SIZE*20)//録音バイト数がバッファーの20倍を越えたら
SendMessage(hwnd,WM_COMMAND,IDC_RECORD_BEG,0);  //stop ボタンを押す
.                     //この2行追加 
.
case IDC_RECORD_BEG: //stop
.
.
waveInReset (hWaveIn) ;
.
.
 実行した結果 目的のバイト数
    INP_BUFFER_SIZE*20 //saveされるのは第2バッファーの内容
 がsaveされました
  録音バッファーが一杯になってから、第2バッファーに転送して処理していますので
  録音バッファーの内容は分かりませんでした 


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました