簡體   English   中英

在物理文件流中創建波文件有效,在內存流中創建失敗,波頭損壞

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM