
waveIn、waveOutでの音声録音・再生プログラミングを作成しています。
内容は、マルチバッファリング機能で音声の取り込みを行い、同時にファイルへの書き込みと、スピーカーへの出力をするのですが、当然waveInで取り込み後にwaveOutするので、元の音声とずれて音がスピーカーへ出力されます。
WAVEFORMATEX構造体のメンバには秒単位での設定値であるため、最小1秒のずれが計算上でます。実際のズレは1秒も無いですが、かなり気になります。
同様の機能のフリーソフトでは、若干のズレはあってもこのプログラムほどではありません。どのようにすれば、このズレを少なく出来るのでしょうか。
どなたか、ご教示願いたくお願いします。
No.2ベストアンサー
- 回答日時:
> (wf.nAvgBytesPerSec=wf.nSamplesPerSec * wf.nBlockAlign / 10;)
それはやったらダメです。
これは「ファイルフォーマット」を指定するものですので、入出力のバッファサイズ(処理時間単位)とは関係なく、常に
1秒あたりのバイト数=1秒あたりのサンプル数×1サンプルあたりのバイト数
でなければなりません。必ず
wf.nAvgBytesPerSec=wf.nSamplesPerSec * wf.nBlockAlign;
にする必要があります。
その上で、PrepareFormat 時の WAVEHDR で指定する dwBufferLengthを、バッファしたい秒数にあわせて、nAvgBytesPerSecの1/10のサイズにしたりする、
といったことになります。
ご指摘ありがとうございます。
dwBufferLength = wf.nAvgBytesPerSec / 10;
ですかね。これで出力したwavファイルも再生できました。
ご教示感謝いたします。
No.1
- 回答日時:
> WAVEFORMATEX構造体のメンバには秒単位での設定値
そんなことはありません。
WAVEFORMATEX の各パラメータは「1秒あたりのデータ量」という「スペック」を指定するものであり、
実際にwaveIn/waveOutするデータ量は1秒単位である必然性はありません。
waveInPrepareHeader/waveOutPrepareHeader 時の WAVEHDR 構造体内の dwBufferLength で、
入出力するデータ量を指定していますが、これは WAVEFORMATEX のnBlockAlignの倍数であればいくらでも構いません。
たとえば、44.1kHz 16bit ステレオなら、nSamplesPerSecは44100、nBlockAlign は 4 になりますが、
176400(=44100*4)バイトのバッファを用意・指定すれば、1秒単位の入出力になりますが、
17640バイトを指定すれば0.1秒単位に、1764バイトのバッファなら0.01秒単位になります。
サイズを小さくすると、それだけタイムラグは小さくなりますが、
その代わりに、入出力処理を行う回数が増えて負荷が重くなりますし、あまりに短すぎると
処理が間に合わずに音飛びしたりする可能性もあります。どの位のサイズがちょうど良いかはプログラム次第です。
(複数のバッファをPrepareHeader しておけば、「たまたまギリギリ間に合わなかった」場合の音飛びは防ぐことができますが、その場合でも平均的にはバッファのPrepareが十分間に合っている必要があり、
「根本的に処理が追いつかない」場合の音飛びには対処できません。そういう場合は、バッファサイズを大きくするしかないです)
早速のご回答ありがとうございます。
>実際にwaveIn/waveOutするデータ量は1秒単位である必然性はありません。
そうでしたか。試しに1/10で録音再生したところ、同時再生でのズレは気にならないぐらいになりました。
(wf.nAvgBytesPerSec=wf.nSamplesPerSec * wf.nBlockAlign / 10;)
ただ、出力したファイルでの再生が出来なくなってしまったので、こちらは少し汗をかいてみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ライブ・コンサート・クラブ ライブ演奏の音の構成?的なのってどうなるですか? 3 2023/04/15 21:25
- 画像編集・動画編集・音楽編集 YouTubeを録音できるソフトを教えてください。 5 2023/02/12 10:19
- 一眼レフカメラ TASCAM DR-10Lの音の同期、音ズレ関して質問です。 TASCAM DR-10Lの48khz 1 2022/10/01 08:29
- ノートパソコン ステレオミキサーが反応しない 1 2023/06/20 23:16
- スピーカー・コンポ・ステレオ 生声録音とスピーカーからの音声録音の違いについて 6 2022/07/28 17:08
- Windows 10 windows付属のボイスレコーダー。雑音が入らないように録音するには? 1 2022/05/16 22:39
- その他(AV機器・カメラ) ピアノ演奏の録画録音 3 2022/10/28 14:01
- その他(スマホアプリ・スマホゲーム) YouTubeの録音(録画にあらず) 1 2022/09/25 14:15
- ビデオカメラ BDの動画より音楽のみをpcへ取り込む方法 5 2022/09/18 13:17
- 工学 音声合成を追加 3 2023/01/30 11:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
シリアル通信エラー
-
「スイッチングハブのバッファ...
-
C#で通信処理。応答がない場合...
-
winsockでソケット通信の開発を...
-
VB2005でWin32APIを用いてRS-23...
-
フローチャートの書き方
-
Macターミナルで実行中のプログ...
-
MACアドレスの調べ方
-
VBAの配列サイズとメモリに関して
-
SendMessageが失敗するときがある
-
MFCスレッド CriticalSection
-
VBSの処理中一旦処理を止めて再...
-
PDFからTIFFに変換できるフリー...
-
vba listviewにおけるtextのAli...
-
マイコンからプログラムを読み...
-
explorer.exeが異様にメモリを食う
-
バックグラウンドのプロセスの...
-
Process.Startの戻り値を後で取得
-
VBコンソールアプリ(.NET Frame...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
「スイッチングハブのバッファ...
-
winsockでソケット通信の開発を...
-
シリアル通信の出力バッファと...
-
WriteFile()でのデータ送信がで...
-
Linuxでのシリアル通信について...
-
WinsockAPIのrecvfromの受信デ...
-
socket: recvはいつ,どれだけ...
-
SerialPortのDataReceivedイベ...
-
ClearCommError呼び出し時のCE_...
-
TCPでの非同期型select関数につ...
-
シリアルポート通信
-
シリアル通信 大きいサイズの...
-
winsockの動作について。
-
ソケット通信内 read関数について
-
COMポートの同時オープン同時読...
-
SocketのSend関数でのCLOSEの検...
-
waveIn、waveOutでの音声録音・...
-
write関数でEAGAINのエラー発生...
-
rs232cでの受信データ(mscomm)...
おすすめ情報