![](/img/trans.png)
[英]Create new excel spreadsheet document using FileStream not MemoryStream in OpenXml
[英]create wavefile in physical filestream works, create in memorystream fails, waveheader corrupt
我有一个带有 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,我收到“波形 header 已损坏”错误。 我重写了 C# 中的源代码,结果相同。 我在 3 个地方查看了 stream 缓冲区的内容。 写完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
我的结论是 stream 是由程序正确编写的,但不是(还没有?)由操作系统用 memory 编写。 但我找不到可以添加的任何 Dispose 或 Close 语句。 Wwriter 本身没有处理,但如果我不使用 IDisposable 处理文件,则 FileStream 版本不会失败,但也不会播放任何内容。 WavStream 只能在播放后关闭,因为 stream 将被丢弃。 你明白我的错误是什么吗?
正如在两条评论中所写的,问题在于在写入 MemoryStream 之后读取它。 只有通过更改文件的 Position 才能克服写入过程没有关闭和处理数据的过程中没有打开。 当使用 MemoryStream 时,这总是需要完成的。 它将被写入,它将被读取,在数据指针之间需要重置为 0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.