• ベストアンサー

waveIn、waveOutでの音声録音・再生プログラミングを作成して

waveIn、waveOutでの音声録音・再生プログラミングを作成しています。 内容は、マルチバッファリング機能で音声の取り込みを行い、同時にファイルへの書き込みと、スピーカーへの出力をするのですが、当然waveInで取り込み後にwaveOutするので、元の音声とずれて音がスピーカーへ出力されます。 WAVEFORMATEX構造体のメンバには秒単位での設定値であるため、最小1秒のずれが計算上でます。実際のズレは1秒も無いですが、かなり気になります。 同様の機能のフリーソフトでは、若干のズレはあってもこのプログラムほどではありません。どのようにすれば、このズレを少なく出来るのでしょうか。 どなたか、ご教示願いたくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

> (wf.nAvgBytesPerSec=wf.nSamplesPerSec * wf.nBlockAlign / 10;) それはやったらダメです。 これは「ファイルフォーマット」を指定するものですので、入出力のバッファサイズ(処理時間単位)とは関係なく、常に 1秒あたりのバイト数=1秒あたりのサンプル数×1サンプルあたりのバイト数 でなければなりません。必ず wf.nAvgBytesPerSec=wf.nSamplesPerSec * wf.nBlockAlign; にする必要があります。 その上で、PrepareFormat 時の WAVEHDR で指定する dwBufferLengthを、バッファしたい秒数にあわせて、nAvgBytesPerSecの1/10のサイズにしたりする、 といったことになります。

oppenheimer
質問者

お礼

ご指摘ありがとうございます。 dwBufferLength = wf.nAvgBytesPerSec / 10; ですかね。これで出力したwavファイルも再生できました。 ご教示感謝いたします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答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が十分間に合っている必要があり、 「根本的に処理が追いつかない」場合の音飛びには対処できません。そういう場合は、バッファサイズを大きくするしかないです)

oppenheimer
質問者

お礼

早速のご回答ありがとうございます。 >実際にwaveIn/waveOutするデータ量は1秒単位である必然性はありません。 そうでしたか。試しに1/10で録音再生したところ、同時再生でのズレは気にならないぐらいになりました。 (wf.nAvgBytesPerSec=wf.nSamplesPerSec * wf.nBlockAlign / 10;) ただ、出力したファイルでの再生が出来なくなってしまったので、こちらは少し汗をかいてみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 4つの音声入力を2つの音声出力で・・・

    4つのコンポジット音声入力を、2つのコンポジット音声出力に分配もしくは切り替えしたいのですが、 そのような夢のような機器はあるのでしょうか・・・。 使用するのは全てコンポジットの赤白端子で、(音声のみで。) ☆PS3の音声 ☆PS2の音声 ☆PCの音声(主に音楽です) ☆スカパーなどのTV音声 ☆予備 上記4ないし5つの入力端子に、 ☆元からあるPC用スピーカー ☆アンプを介してのスピーカー この2つを場合によって切り替えて出力したいんです。 アンプとスピーカーが手に入ったのですが、 少々事情があり、我が家は夜中はごくごく小さな音しか出せません。 そこで、大きな音を出してもいい昼間や誰もいない時などはアンプにつながった大きなスピーカーから出力して、 静かにしなければいけない時は元からあるPC用スピーカーから・・・という風に使い分けたいのです。 条件を要約すると。 ( )内はあくまで希望です。自分にとって一番理想的な機能を書きました。 ●コンポジット入力端子4つ。(5つだと尚嬉しい。予備用に。) ●コンポジット出力端子2つ。 (もし同時出力できたら尚嬉しい。 そしてそれぞれの入力をどちらから出力するかとか各々で選べたりするともっと嬉しい。) ●それを介することによって音質が低下してしまうというのは避けたいです。 とりあえず価格は問いません。 このようなセレクターのようなものがほしいのですが、色々探してみても私には見つけられませんでした。 もしご存知の方や、「それはありえねぇ」などのアドバイスもあれば、教えていただけませんか。 よろしくお願い致します。

  •  waveOutOpen関数で分からないことがあります。

     waveOutOpen関数で分からないことがあります。 waveOutOpen関数を使ってマルチバッファリングを行っています。 初期化段階でwaveOutOpenを二つ使いMM_WOM_DONEでストリーム 再生をしているのですが、別の場所でwaveOutOpenをやるとそこか ら音が途切れ途切れになります。 できれば複数再生をしたいのですが、waveOut系は複数再生が不可能 なんでしょうか? データブロックとかと関係がありそうなんですがいまいち分かりません。 この原因を知りたいのですが、教えてください。

  • スピーカー側から音声がでるようにするには?

    プロジェクターEB-X8ですが自力充電のスピーカ-を取り付けても機能しません。プロジェクター側からの音声でなくスピーカー側から音声がでるようにするにはどうしたらよいのでしょうか? スピーカー自体はパソコンをプロジェクターに接続しない場合ちゃんと音声出力しています。 ※OKWAVEより補足:「EPSON社製品」についての質問です。

  • PCの音声を電圧に変える機器ありますか?

     パソコンより警報を接点で出力したいのですが、パソコンにその機能はありません。音声を電圧に変換にして、フォトカプラー変換して接点にしようと考えています。フォトに変換してワンショットで出力してくれる機材があれば尚良いのですが。 出力幅は、5秒欲しいです。 音声ソフトで音声を出力する事は可能です。

  • リモコンで音声の切替と音量調節ができるスピーカー

     ひとつの液晶モニターにPCとPS3を繋げて使用しています。現在使っている液晶モニターは音声出力ができないので、PS3の音声はAVマルチ出力端子?(黄赤白のうち赤白)をスピーカーにつないで出力しています。  現在スピーカーがひとつしかなく、音量調節やPCを使う場合にいちいちそばまで寄ってケーブルを挿し換えるのがとても面倒なのですが、リモコンでPCとPS3の音声切替と音量調節ができるスピーカーはあるのでしょうか?もしあるとすれば価格はどれくらいでしょうか?  事前にネットで調べてみたのですが、あまり知識が無く、ここで質問させていただきました。よろしくお願いします・

  • スピーカーか多重に聞こえる音声

    スカイプをしながら、音楽を聴くなどしていると、 声と干渉?して、大変聞き取りづらくなります。 音と音がぶつかっている感じです。 スピーカーはアナログ接続です。 これをUSBスピーカーやインカムを購入することによって、スカイプと 他の音声を独立させることはできますか? パソコンにはオンボードの音声出力端子が2つ付いていますが、 一つは機能してない?みたいです。 それとも何らかの方法で使用することは出来ますか?

  • PCで再生、音声(BOSEアンプ)、映像はテレビ

    PCでDVDを再生します。 音声はBOSEのアンプ(model1701)を通してスピーカーから出す。 映像はKDL-32EX420-B ブラビア32V型で映したい。 今、テレビとPCはHDMI、アンプとPCはPCのイヤホンジャックから赤・白線。 そのほかにARC機能があり、テレビとアンプを繋げないといけないのでしょうか? BOSEのアンプ(model1701)には赤白ジャック出力しかありません。 どうにかして、PCのDVDを、映像はテレビ、音声はアンプを通してスピーカーから音声を出せませんか?(ただ単にPCの音楽をアンプを通してスピーカーから音声を出すことは出来ます。) ご回答お願いします。

  • テレビとAV機器の音声出力について

    我が家のテレビの音声出力からステレオ機器のAUXにつなぎ、そのスピーカーからの音を楽しんでいるのですが、プレステ2でゲームやDVDを見るとこの機能が使えません。テレビ入力のビデオ1.ビデオ2.ビデオ3に切り替えると、音声出力端子からの出力が出なくなります。安価で出来る良い方法は無いでしょうか?ちなみに、以前はテレビのヘッドフォン端子からステレオ機器にわざわざつないでいましたが、テレビ本体のスピーカーから音声が出ないため、サラウンドが出来ませんでした。ヨロシクお願いします。

  • waveIn、waveOut系プログラミングについて

    立て続けに投稿させて頂いております。 【要点】 メッセージ処理のタイミングについて。  現在win32APIを用いた録音再生をするプログラムを作成中です。最終目的はPCが音声をスピーカーから出力し、それを再度PCに録音するというものです。  waveIn系、waveOut系の関数を用いたプログラムについて様々なホームページを参考にさせて 頂いたのですがホームページごとに関数とメッセージの関係が異なっていた為、挙動をしっかりと 理解する為教えて頂きたいです。  例えば最初にGUI上の録音ボタンを押したときに waveInOpen→waveInPrepare→waveInAddBuffer→waveInStart と行っているのですが 私の認識ではwaveInPrepareはMM_WIM_OPENメッセージを受け取ってから行うものだと考えていたのですが あるホームページではMM_WIM_OPENに対する処理が記述されていない、つまりcase MM_WIM_OPENがないサンプルソース もあり、メッセージを処理するタイミングがわからなくなってしまいました。 1: waveInOpenによりMM_WIM_OPENが発行されるとしたら発行されたかわからないタイミングでwaveInPrepareはやるべきでないと思ったのです。 2: その他waveInAddはどのタイミングで行うのか、等もアドバイスいただけると助かります。 3: 私が見た限りのソースでは録音ボタンを押すとWAVEHDR、HWAVEINを行っているのですが などの準備を行っているのですが、録音前に準備しておけばタイムラグがないのに、、と考えるのですが何か意図が あるのでしょうか。 4:MMSYSERR_~というエラーをwave系関数は出すようなのですがそれについて調べたいのですがMSDN等で調べられるのでしょうか(私が調べた限りなさそうでした) 質問が多くて申し訳ないのですが極力自分で調べたので よろしくお願いいたします。具体的な回答でなくとも 調べるヒントなどいただければ幸いです。

  • TV(REGZA)の音声出力

    TV(REGZA37Z1)アナログ音声出力端子(赤白)→アンプ→外付けスピーカーと接続。 音量調整をアンプに遠隔操作機能(リモコン)無い為TV設定で音声出力を「可変」にしてリモコンで行おうとしましたが外付けスピーカーから音が出ません。「固定」では音が出ます。 同じ経験者がおりましたらアドバイスお願いします。

このQ&Aのポイント
  • 昨日、10枚をプリントした後、一太郎で約一時間ほど作業して、そのファイルをプリントしようとしたがプリントできず。トナーは半分あるのでインク切れではないのに…診断・検証ツールでチェックしたが「問題は見つかりませんでした」という結果。プリンターとパソコンの電源コードを抜いて5分後に接続してみたが状況は変わらずです。パソコンのプリンターのプロパティマネジメントをチェックしたが、問題は無さそうでしたが。変化なくプリンタードライバーを入れ直してみたけど、変わらずプリントできません
  • 質問者は、ブラザー製品のMFC-J737DNでプリントができなくなったと困っています。プリンターのトナーは半分残っており、インク切れでないことを確認しました。診断・検証ツールでチェックしたところ、問題は見つからなかったため、プリンターとパソコンの電源を一度抜き、再接続しても状況は変わらないようです。パソコンのプリンターの設定も問題なさそうで、プリンタードライバーの再インストールを試してもプリントできません。
  • 質問者は、昨日までは正常にプリントができていたが、10枚をプリントした後にプリントできなくなりました。プリンターのトナーは半分残っているため、インク切れではないと判断しました。問題の原因を確認するために診断・検証ツールを使用しましたが、問題は見つかりませんでした。また、プリンターとパソコンの電源を一度抜いてから再接続しても状況は変わりませんでした。パソコンのプリンターの設定も問題なさそうで、プリンタードライバーを再インストールしてもプリントできません。アドバイスを求めています。
回答を見る

専門家に質問してみよう