简体   繁体   English

在memoryStream之后处置writer

[英]Dispose writer after memoryStream

This is a piece of my code: 这是我的一部分代码:

private static MemoryStream outputStream;


public static void ConvertMp3ToWavStream(string inputPath)
        {                           
            outputStream = new MemoryStream();
            using (Mp3FileReader reader = new Mp3FileReader(inputPath))
            {
                using (WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(reader))
                {
                    WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, waveStream.WaveFormat);

                    byte[] bytes = new byte[waveStream.Length];
                    waveStream.Position = 0;
                    waveStream.Read(bytes, 0, (int)waveStream.Length);
                    waveFileWriter.Write(bytes, 0, bytes.Length);
                    waveFileWriter.Flush();                    
                }
            }                
        }

This is my CloseAndDispose method, which I invoke after some manipulations: 这是我的CloseAndDispose方法,在进行一些操作后会调用该方法:

private static void CloseAndDispose()
        {
            if (outputStream != null)
            {
                outputStream.Close();
                outputStream.Dispose();
            }
        }

The problem: after all actions I've got some memory in memory stack, which wasn't disposed. 问题是:在完成所有操作后,我在内存堆栈中有一些内存,没有被处置。 As I understand, It's my writer . 据我了解,这是我的writer When I try to dispose writer, I get an exception. 当我尝试处置作家时,我遇到了一个例外。 (can't read MemoryStream ). (无法读取MemoryStream )。 When I try to close and dispose writer after CloseAndDispose() method, I get an exception. 当我尝试在CloseAndDispose()方法之后关闭并处置writer时,出现异常。 Where should I close waveFileWriter ? 我应该在哪里关闭waveFileWriter

NAudio has a helper class called IgnoreDisposeStream in the NAudio.Utils namespace. NAudio在NAudio.Utils命名空间中有一个名为IgnoreDisposeStream的帮助程序类。 Wrap your memory stream in one of those before passing it into the WaveFileWriter 在将其传递到WaveFileWriter之前,将其中的存储器流包装为其中WaveFileWriter

using (var writer = new WaveFileWriter(new IgnoreDisposeStream(outputStream),
                                       waveStream.WaveFormat))
{
    ...
}

You could pass a local MemoryStream to WaveFileWriter and copy it to the global one before it's disposed: 您可以将本地MemoryStream传递给WaveFileWriter并在处置之前将其复制到全局WaveFileWriter

public static void ConvertMp3ToWavStream(string inputPath)
{                           
    outputStream = new MemoryStream();
    var outputStreamLocal = new MemoryStream();
    using (...
    {        
            using (var waveFileWriter = new WaveFileWriter(outputStreamLocal, ...
            {
                ...
                outputStreamLocal.CopyTo(outputStream);
            }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM