2015-06-24 2 views
0

Это часть моего кода:Dispose писатель после MemoryStream

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();      
       } 
      }     
     } 

Это мой CloseAndDispose метод, который я призываю после некоторых манипуляций:

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

Проблема: после того, как все действия, я у вас есть память в стеке памяти, которая не была удалена. Насколько я понимаю, это мой writer. Когда я пытаюсь уничтожить писателя, я получаю исключение. (не может читать MemoryStream). Когда я пытаюсь закрыть и удалить автора после метода CloseAndDispose(), я получаю исключение. Где я должен закрыть waveFileWriter?

+0

Если это это [WaveFileWriter] (https://daisy-trac.cvsdude.com/urakawa-sdk/browser/trunk/csharp/audio /NAudio/Wave/WaveOutputs/WaveFileWriter.cs?rev=1346), вы немного застряли. * Некоторые * классы, основанные на потоке, позволяют создавать их с параметром, который указывает, должен ли передаваемый поток быть «Disposed», но этот, похоже, не дает вам эту опцию. Конечно, если вы работаете с этим источником, вы можете изменить его для реализации этой опции. –

ответ

3

NAudio имеет вспомогательный класс под названием IgnoreDisposeStream в NAudio.Utils пространстве имен. Оберните поток памяти в одном из тех, перед передачей его в WaveFileWriter

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

Вы могли бы передать местный MemoryStream в WaveFileWriter и скопировать его в глобальный, прежде чем он расположен:

public static void ConvertMp3ToWavStream(string inputPath) 
{       
    outputStream = new MemoryStream(); 
    var outputStreamLocal = new MemoryStream(); 
    using (... 
    {   
      using (var waveFileWriter = new WaveFileWriter(outputStreamLocal, ... 
      { 
       ... 
       outputStreamLocal.CopyTo(outputStream); 
      } 
    } 
} 
Смежные вопросы