0

タイトルが示すように、vb.net 2010 と NAudio ライブラリを使用してマイク データをリアルタイムで保存および再生しようとしています。NAudio Codeplex Web サイトから C# でこのコードを取得し、vb.net に翻訳しました。コードにエラーはなく、プログラムは動作します (実際に動作しているかどうかを確認するために、マイク データが利用可能になるたびにラベルを増やしたり更新したりするカウンターを配置しました) が、何も聞こえません。

ここにコードがあります

NAudio をインポートします
インポート System.IO 
'私が使用しているライブラリ

Private Sub wi_dataAvailable(ByVal obj As Object, ByVal e As Wave.WaveInEventArgs) wi.DataAvailable を処理します count += 1 'ここでカウンターが増加します Label1.Text = count 'そして、ここでラベルが更新され、正常に動作しているようです play_packet(e.Buffer) サブ終了

Private Sub play_packet(ByVal DR() As Byte) Dim MS As New MemoryStream(DR) Dim frmt As New Wave.WaveFormat frmt = Wave.WaveFormat.CreateALawFormat(8000, 1) Dim rsws As New Wave.RawSourceWaveStream(MS, frmt) Dim pcms As Wave.WaveStream = Wave.WaveFormatConversionStream.CreatePcmStream(rsws) Dim m_bwp As New Wave.BufferedWaveProvider(New Wave.WaveFormat(8000, 16, 1)) Dim dec() As Byte = cnssb(pcms) m_bwp.AddSamples(dec, 0, dec.Length) Dim latency As Integer Dim cbi As Wave.WaveCallbackInfo = Wave.WaveCallbackInfo.NewWindow Dim out_dev As New Wave.WaveOut(cbi) out_dev.DesiredLatency = latency out_dev.Init(m_bwp) out_dev.Play() End Sub Private Function cnssb(ByVal nss As Wave.WaveStream) As Byte() Dim memstr As New MemoryStream Dim buff(1024) As Byte Dim bytes As Integer bytes = nss.Read(buff, 0, buff.Length) While bytes > 0 memstr.Write(buff, 0, bytes) bytes = nss.Read(buff, 0, buff.Length) End While Dim by() As Byte = memstr.ToArray Return by End Function

あなたが私を助けてくれることを願っています!

4

2 に答える 2

0

記録されたバッファを受信するたびに新しい WaveOut と BufferedWaveProvider を作成するべきではありません。代わりに、それぞれを 1 つ作成し、受信したオーディオを BufferedWaveProvider に追加するだけです。

于 2013-11-06T10:40:00.540 に答える
0

解決しました!

ブール変数を宣言してから、次のように play_packet 関数を編集しました。

dim initialized as boolean
'in the form load i set the variable to false
'and then here is the function

Private Sub play_packet(ByVal DR() As Byte)
        Dim MS As New MemoryStream(DR)
        Dim dec() As Byte = MS.ToArray
        m_bwp.AddSamples(dec, 0, dec.Length)
        MS.Close()
        MS.Dispose()
        Dim latency As Integer = 50
        Dim cbi As Wave.WaveCallbackInfo = Wave.WaveCallbackInfo.NewWindow
        Dim out_dev As New Wave.DirectSoundOut
        out_dev.Volume = 1
        If initialized = False Then
            out_dev.Init(m_bwp)
            out_dev.Play()
            initialized = True
        End If
    End Sub
于 2013-11-07T09:46:52.303 に答える