【问题标题】:create wavefile in physical filestream works, create in memorystream fails, waveheader corrupt在物理文件流中创建波文件有效,在内存流中创建失败,波头损坏
【发布时间】:2021-06-19 09:30:18
【问题描述】:

我有一个带有 Wav 样本的缓冲区,我想播放它。 使用FileStream 可以。 使用 MemoryStream 失败并在 soundPlayer.Play 语句中出现 System.InvalidOperationException 'The wave header is corrupt'。

这是有效的来源:

 Friend Sub New(buffer() As Byte, nBytes As Integer)
    'Dim wavStream As MemoryStream = New MemoryStream(CInt(nBytes + 44))
    Dim wavStream As FileStream = New FileStream("xxf.wav", FileMode.OpenOrCreate)
    waveFormat = New WaveFormat(44100, 16, 2)
    Wwriter = New WaveWriter(wavStream, waveFormat)
    Wwriter.Write(buffer, 0, nBytes)
    CType(Wwriter, IDisposable).Dispose()
    'soundPlayer = New System.Media.SoundPlayer(wavStream)
    soundPlayer = New System.Media.SoundPlayer("xxf.wav")
    soundPlayer.Play()
    soundPlayer.Dispose()
    soundPlayer = Nothing
    wavStream.Dispose()
    wavStream.Close()
End Sub

更改 2 条注释行,以使用 MemoryStream 代替 FileStream,我收到“波头已损坏”错误。 我用 C# 重写了源代码,结果相同。 我在 3 个地方查看了流缓冲区的内容。写完Wavheader,写完数据,处理完。由此产生的差异仅在 Chunksize 中:

after write of wavhdr:
 filestream   buffer(4) 12 127 26 0  (= 818970, the correct number of short samples)
 memorystream buffer(4) 36 0 0 0     (the number is there because I overwrite the same filedata)

after write of buffer:
 filestream   buffer(4) 12 127 26 0
 memorystream buffer(4) 36 0 0 0

after dispose: 
 identical  buffer(4) 12 127 26 0

我的结论是程序正确地写入了流,但操作系统没有(还没有?)将其写入内存。但我找不到可以添加的任何 Dispose 或 Close 语句。 Wwriter 本身没有处理,但如果我不使用 IDisposable 处理文件,则 FileStream 版本不会失败,但也不会播放任何内容。 WavStream 只能在播放后关闭,因为流将被丢弃。 你知道我的错误是什么吗?

【问题讨论】:

  • 在播放之前尝试倒带 - 只需将 Position 设置为 0。
  • 通常人们在写入之后和读取之前忘记将 MemoryStream 的位置设置为零。只需 ms.Position = 0;
  • 两个答案都是正确的。谁要积分?

标签: c# vb.net cscore


【解决方案1】:

正如在两个 cmets 中所写的那样,问题在于在写入后读取 MemoryStream。 写入过程没有关闭和处理数据的过程中没有打开只能通过更改文件的位置来克服。 当使用 MemoryStream 时,这始终需要完成。它会被写入,它会被读取,在数据指针之间需要重置为0。

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 2018-07-29
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2012-04-18
    • 2011-02-18
    相关资源
    最近更新 更多