[英]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.