【发布时间】: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;
-
两个答案都是正确的。谁要积分?