0

NAudio ライブラリを使用して、実際の再生に Media Soundplayer を使用してアプリケーションで再生用のサウンドエフェクトをインライン変換しようとしています。(NAudio の再生は、直接再生の場合は少しぎくしゃくしているため、変換)

ファイルをディスクに抽出して再生するのではなく、memoryStream を使用してメモリ内の WAV に変換したいのです。

NAudio ソースを見ると、ストリームが破棄されるまで一部のデータがストリームに書き込まれないように見えますが、これにより MemoryStream が無効になります。私はそれを作り直す必要がありますか、それとも私はそれをすべて間違っていますか?

次のコードを使用すると、無効なヘッダーが表示されます。

コードを置き換えてファイルをディスクに書き込み、破棄してからストリームにリロードすると、すべて問題ありません(ただし、目的に反します)

Private Sub PlaySound(ByVal ms As Stream)
    Dim ss As System.Media.SoundPlayer
    ss = New System.Media.SoundPlayer
    ss.Stream = ms
    ss.Load()
    Try
        ss.PlaySync()
    Catch ex As InvalidOperationException
        Debug.Print(ex.ToString)
    End Try
End Sub

Private Sub ConvertToStream()
    Using reader As New Mp3FileReader("C:\KMSounds\sound12.mp3")
        Using convertedStream As WaveStream = WaveFormatConversionStream.CreatePcmStream(reader)
            'File.Delete("c:\test2.wav")
            'Using ms As New FileStream("c:\test2.wav", FileMode.Create)
            Using ms As New MemoryStream
                Using w As New WaveFileWriter(ms, convertedStream.WaveFormat)
                    Dim buffer() As Byte = CType(Array.CreateInstance(GetType(Byte), convertedStream.GetReadSize(4000)), Byte())
                    While True
                        Dim bytesRead As Integer = convertedStream.Read(buffer, 0, buffer.Length)
                        If (bytesRead = 0) Then
                            w.Flush()
                            Exit While
                        Else
                            w.WriteData(buffer, 0, bytesRead)
                        End If
                    End While
                    PlaySound(ms)
                End Using
            End Using
        End Using
    End Using
End Sub

System.InvalidOperationException: ウェーブ ヘッダーが破損しています。C:\ Development\Spikes\NAudioConvert\ConvertAudio.vb:78行目

これに関するヒントはありますか?または、非常に小さな MP3 ファイルを再生用に WAV に変換するために使用できる別のライブラリがあれば素晴らしいでしょう。

4

1 に答える 1

1

WaveFileWriter が WAV ヘッダーに戻って正しい数のデータ バイトを埋めるのは、WaveFileWriter を破棄するときだけです (WriteData を呼び出すたびにこれを行う必要がありません)。ただし、必要に応じて、データ バイト値を最新に保つカスタム WaveFileWriter を作成することをお勧めします。これを NAudio の将来のバージョンのオプションとして追加することを検討しています

于 2010-09-29T06:37:47.067 に答える