2011-12-28 1 views
3

Хорошо, я знаю, это звучит как очень простой вопрос для некоторых, но я действительно застрял здесь. Действительно, я создаю аудиоплеер, используя Naudio, и я понял, что во многих учебниках люди всегда показывают простые способы, чтобы вы начали. Однако, на мой взгляд, они всегда забывают показать, как вещи действительно выполняются в реальном приложении. Например, при воспроизведении музыки с помощью Naudio я бы сделал что-то вроде:Naudio: Как играть в MP3 и WAV-файл?

Void PlayAudioMusic(string FilePath) 

    { 

    using (var ms = File.OpenRead(FilePath)) 
    using (var rdr = new Mp3FileReader(ms)) 
    using (var wavStream = WaveFormatConversionStream.CreatePcmStream(rdr)) 
    using (var baStream = new BlockAlignReductionStream(wavStream)) 
    using (var waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) 
    { 
     waveOut.Init(baStream); 
     waveOut.Play(); 

    } 
} 

Это отлично подходит для тестирования в простом консольном приложении. Это, однако, не полезно, если вы на самом деле создаете серьезное приложение. Например, что многие учебники не говорят, например, как обрабатывать наиболее важные вещи, такие как:

  1. Располагая ресурс и когда сделать это
  2. Лучшие способы обработки различных исключений
  3. Что делать до паузы, остановки, перемотки назад или даже выхода из приложения
  4. Другие вещи, которые я даже не знаю, существуют. Поскольку я перехожу к этому процессу и замечаю, что мое приложение имеет слишком много исключений, может кто-то поделится, как класс оболочки вокруг Naudio, с которым он справлялся. Я уверен, что это ответит на многие проблемы, которые некоторые из нас переживают, пытаясь использовать Naudio.

Спасибо.

ответ

6
  1. Чтобы удалить неуправляемые ресурсы, вы вызываете метод Close для WaveStreams. Часть «когда это сделать» довольно очевидна ... Неужели вы не знаете, когда настало время Dispose неуправляемых ресурсов? Вы уничтожаете их, когда вы больше не собираетесь их использовать.
  2. Я не могу ответить на этот вопрос. Сожалею.
  3. Чтобы сделать паузу, вы вызываете метод Пауза объекта WaveOut. Чтобы перемотать назад, вы вызываете метод Seek WaveStream. Чтобы остановить, НЕ НАЙДИТЕ метод Stop WaveOut. Вы должны вызвать Pause, а затем вызвать метод Seek WaveStream, чтобы перейти в начало буфера.
  4. Наиболее вероятная причина всех Исключений, которые вы выбрали, состоит в том, что большая часть кода, который вы показали, фактически не нужна. Все, что вам нужно сделать, чтобы воспроизвести файл MP3:

.

WaveStream mainOutputStream = new MP3FileReader(path_of_the_file_you_want_to_play); 
WaveChannel32 volumeStream = new WaveChannel32(mainOutputStream); 

WaveOutEvent player = new WaveOutEvent(); 

player.Init(volumeStream); 

player.Play(); 

Я лично предпочитаю использовать WaveOutEvent вместо WaveOut, потому что он не требует от вас быть с помощью форм, ни WPF, что позволяет использовать NAudio для абсолютно любого типа приложения, который вы хотите сделать с C#, даже XNA игр. Кроме того, WaveOutEvent имеет очень удобную функцию «пожара и забывания», и конструктор даже не требует обратного вызова.

Все эти WaveStreams, предназначенные для изменения информации о буфере (например, Sample Rate of Bit Depth), - это просто способы попросить NAudio выбросить исключение. Они редко работают, когда используются так. Если вы хотите конвертировать некоторые вещи из буферов, вам нужно вызвать некоторые статические методы WaveFormatConversionStream (по крайней мере, их имена не требуют пояснений).

+0

Отличный ответ. Для правильности позвольте мне указать, что это должен быть Mp3FileReader с нижним регистром «p». – henon