VFW とオーディオ キャプチャ コールバックを使用して、Webcam からオーディオデータをキャプチャしています。同時に、同じキャプチャ コールバックの本体内で、waveOutWrite を使用して、サンプリングされたデータをデフォルトの MAPPER に転送します。
Webcam からの信号品質は、1 チャネル/8 ビット/11025 サンプル/秒です。FORMAT_QUERYフラグを指定したwaveOpenのおかげで、サウンド形式はデフォルトのオーディオ デバイスでサポートされています。
waveWriteOutの戻り値はNOERRORですが、私の予想とはかけ離れています。部屋の中は静かで、空のホワイトノイズのような音のはずです。
Pls、音のYouTube録音を聞いてください
16K 程度のサイズのパックごとに開始し、WAVEHDR 構造は問題ありません。その後、徐々に速度が低下し、システムの回復不能エラーで終了します。
それは何に似ていますか?
以下は VFW からのオーディオ dta レシーバー コードです。lpWHdr は視覚的には問題ありません。内部フラグが 2 = Prepared にトリガーされていても、VFW と WaveAudio が互いに作成されているようです :)
public static void capAudioStreamCallback(UIntPtr hWnd, ref WAVE.WAVEHDR lpWHdr) {
Say(String.Format(DateTime.Now.ToString("mm:ss:fff ") + "Received {0} of audio data", lpWHdr.dwBytesRecorded.ToString()));
Application.DoEvents();
WA.WAVEHDR_FLAGS flag = (WA.WAVEHDR_FLAGS) lpWHdr.dwFlags;
if ((WA.WAVEHDR_FLAGS)lpWHdr.dwFlags != WA.WAVEHDR_FLAGS.WHDR_PREPARED)
CheckWAError("waveOutPrepareHeader", WA.waveOutPrepareHeader(phwo, lpWHdr, (uint)Marshal.SizeOf(lpWHdr)));
CheckWAError("waveOutWrite", WA.waveOutWrite(phwo, lpWHdr, (uint)Marshal.SizeOf(lpWHdr)));
CheckWAError("waveOutUnprepareHeader", WA.waveOutUnprepareHeader(phwo, lpWHdr, (uint)Marshal.SizeOf(lpWHdr)));
return;
}
static void CheckWAError(string Func, WA.MMSYSERR err) {
if (err == WA.MMSYSERR.MMSYSERR_BASE_NOERROR) { Say(Func + " WA Ok"); return; }
IntPtr str = Marshal.AllocHGlobal(200);
string s = "";
WA.waveOutGetErrorText(err, str, 200);
s = Marshal.PtrToStringAnsi(str);
Marshal.FreeHGlobal(str);
Say(Func + " err: " + s);
}
DateTimeミリ秒のスタンプが表示され、1400ミリ秒ごとに刻み、サンプルレート= 11025であり、バッファサイズは約16500バイト= OKのように見えるため、バッファはオーバーランしていないと思います..
UPD:管理されていないバッファーを管理対象にコピーし、その値を調べました。鋸歯または過負荷の副鼻腔のように見えます。0 4 0 3 0 32 109 213 255 251 255 243 241 97 0 7 0 2 1 1 0 5 0 そして、ほぼ同じ数と同じ周期で再び上下します。正確ではありませんが、ほぼ同じです (+/-)。また、そのカムからの信号を内蔵の Windows レコーダーを使用して録音することもできます。また、信号レベルが上下にジャンプするように、自分の声の上下が見えるので、Web カメラのマイクも問題ありません。 VFW入力オーディオ信号フィーダーが間違っています。WAVEFORMATEX を受け入れて WAVEHDR を送り返しても、どちらも問題ありません... しかし、バッファ データには Web カメラではなく他のソースが入力されていますが、VFW は Web カメラからのものである必要があると言っています。 、そしてそれは機能しています。私は1つの余分なメッセージを追加しました: SendMessage(camHwnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, audioCallback); VFW の代わりに waveIn を使用すれば、問題なく動作することはほぼ確実です.後で確認します..