Наудио: Как воспроизвести MP3 и WAV файл? - PullRequest
3 голосов
/ 28 декабря 2011

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

  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, который он использовал для этого.Я уверен, что это ответит на многие проблемы, с которыми некоторые из нас сталкивались, пытаясь использовать Наудио.

Спасибо.

1 Ответ

7 голосов
/ 04 января 2013
  1. Чтобы избавиться от неуправляемых ресурсов, вы вызываете метод Close в WaveStreams.Часть «когда это сделать» довольно очевидна ... Вы действительно не знаете, когда пришло время утилизировать неуправляемые ресурсы?Вы избавляетесь от них, когда больше не собираетесь их использовать.
  2. Я не могу ответить на этот вопрос.Извините.
  3. Чтобы сделать паузу, вы вызываете метод Pause объекта 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, потому что он не требует использованияForms или WPF, что позволяет вам использовать NAudio для абсолютно любых приложений, которые вы хотите сделать с C #, даже для игр XNA.Кроме того, WaveOutEvent очень прост в использовании, и его конструктор даже не запрашивает обратный вызов.

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

...