Naudio: Как воспроизводить файлы MP3 и WAV?

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

Спасибо.


person Dillion Ecmark    schedule 28.12.2011    source источник


Ответы (1)


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

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

person Community    schedule 03.01.2013
comment
Отличный ответ. Ради корректности, позвольте мне указать, что это должен быть Mp3FileReader со строчной буквой «p». - person henon; 08.06.2017