0

シナリオ:

私は NAudio 1.5 を使用しており、次のように IWaveProvider から PCM、8 ビット、22050hz の形式で正弦波を記録しようとしています。

Private Sub record(ByVal waveForm As String, _
                   ByVal duration As Integer, _
                   ByVal frequency As Integer, _
                   ByVal amplitude As Integer, _
                   ByVal sampleRate As Integer)
    Dim wave As IWaveProvider = _
          Audio.SoundModulWaveFormProviderFactory.createWaveForm(waveForm, _
                frequency, amplitude, sampleRate)
    Dim memStream As New System.IO.MemoryStream()
    Dim writer As New WaveFileWriter(memStream, wave.WaveFormat)
    Dim numberOfBytes As Integer = writer.WaveFormat.AverageBytesPerSecond
    Dim buffer(numberOfBytes) As Byte
    Dim i As Integer
    Dim count As Integer
    For i = 1 To duration
        count = wave.Read(buffer, 0, numberOfBytes)
        writer.Write(buffer, 0, count)
    Next
    writer.Flush()
    Try
        Me.audioStream = New MemoryStream()
        memStream.WriteTo(Me.audioStream)
    Catch ex As Exception
        Trace.WriteLine(ex.Message)
    End Try
    writer.Close()
    recorded = True
End Sub

メモリ ストリームは、wave ファイル全体を解析し、サウンドのリストに含める関数に渡されます。

問題

上記の関数は、wave データの長さがバイト位置 42 から 45 であることを想定しています。残念ながら、これは常に 0 のようです。したがって、長さは返されません。

質問:

WaveFileWriter がこの情報を MemoryStream に書き込んでいることを確認するにはどうすればよいですか? それとも、ファイルへの書き込み時にのみそれを行いますか?

同じ目標に到達するための別の方法があるのではないでしょうか?

アップデート:

ファイルに直接書き込む場合、WaveFileWriter にはウェーブ データの長さが含まれます。

4

1 に答える 1

1

長さは、Close を呼び出すときに WaveFileWriter によってのみ設定されます。したがって、try ブロックの前に writer.Close を移動します。また、NAudio には IgnoreDisposeStream というヘルパー クラスがあり、これを使用して、必要な前に MemoryStream が破棄されるのを防ぐことができます。

Dim writer As New WaveFileWriter(new IgnoreDisposeStream(memStream) ...

...
writer.Close()
Try
    Me.audioStream = New MemoryStream()
    memStream.WriteTo(Me.audioStream)
Catch ex As Exception
    Trace.WriteLine(ex.Message)
End Try

recorded = True
于 2012-10-05T17:38:06.347 に答える