PCM Wave 文件中的数据长度使用 MemoryStream 和 WaveFileWriter

Posted

技术标签:

【中文标题】PCM Wave 文件中的数据长度使用 MemoryStream 和 WaveFileWriter【英文标题】:Data length in PCM Wave file using MemoryStream with WaveFileWriter 【发布时间】:2012-10-04 00:00:15 【问题描述】:

场景:

我正在使用 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

然后将内存流移交给解析整个波形文件并将其包含到声音列表中的函数。

问题

上面提到的函数期望波形数据的长度是从字节位置 42 到 45。不幸的是,这似乎总是 0。因此我没有得到任何长度。

问题:

如何确保 WaveFileWriter 正在将此信息写入 MemoryStream?还是仅在写入文件时才这样做?

也许有不同的方法可以达到相同的目标?

更新:

WaveFileWriter 在直接写入文件时确实包含波形数据长度。

【问题讨论】:

【参考方案1】:

长度仅在调用 Close 时由 WaveFileWriter 设置。所以移动 writer.Close 在你的 Try 块之前。此外,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

【讨论】:

以上是关于PCM Wave 文件中的数据长度使用 MemoryStream 和 WaveFileWriter的主要内容,如果未能解决你的问题,请参考以下文章

使用 PyDub 时出错:WAVE 格式不支持 pcm_s8 编解码器

如何将Pcm格式的音频文件转换成Wave格式的文件

Android:Creating Wave file using Raw PCM, wave file不播放

何时使用 Wave 可扩展格式?

WAVE PCM soundfile format

iOS开发——WAVE音频文件解析