Повторное воспроизведение того же mp3-файла с помощью NAudio

Каков рекомендуемый способ воспроизведения mp3-файла снова и снова с помощью NAudio?

что я делаю до сих пор:

в одном глобальном месте:

Mp3Reader mp3Reader = new Mp3FileReader(url);

затем для каждого раза, когда должен воспроизводиться mp3:

WaveStream channel = new WaveChannel32( mp3Reader) ;
IWavePlayer waveout = new WaveOut();
waveout.Init(channel);
waveout.PlaybackStopped += new EventHandler(naudio_PlaybackStopped);
waveout.Play();

но играет только первый раз.

кроме того, он дает следующее утверждение:

WaveOut device was not closed

возможно, файл mp3 следует воспроизвести еще раз, пока воспроизводится первый экземпляр.


person clamp    schedule 24.09.2012    source источник


Ответы (1)


Если вы хотите зациклиться, я бы сделал это, создав собственный IWaveProvider, который внутри создает Mp3FileReader. Затем в методе Read он проходит через данные, которые он считывает из Mp3FileReader. Когда он доходит до конца (mp3FileReader.Read возвращает 0), вы устанавливаете позицию обратно на 0 и продолжаете чтение (и вы также можете вставить немного тишины между ними).

Другой подход — использовать MixingSampleProvider в последней версии NAudio (доступно в Nuget), которую вы могли затем просто добавляйте экземпляры AudioFileReader всякий раз, когда вы хотите воспроизвести файл MP3. Тогда вы могли бы одновременно воспроизводить один и тот же файл MP3. Вы также можете добавить фиктивный бесконечный поток тишины, чтобы гарантировать, что воспроизведение никогда не закончится, и вы можете поставить в очередь новый MP3 в любое время.

Кроме того, «устройство WaveOut не было закрыто» означает именно это. Вы не можете вызвать Init во второй раз. Вы должны удалить свой оригинал и создать новый (например, в вашем обработчике PlaybackStopped), если вы не хотите использовать собственный подход поставщика волн или микшера.

person Mark Heath    schedule 24.09.2012
comment
Спасибо за ответ. Я попробую второй вариант и дам вам знать, если он сработает. это для игры, кстати. - person clamp; 25.09.2012
comment
об ошибке waveoutdevice: я на самом деле делаю Dispose() для WaveOut, когда воспроизведение остановлено. как вы можете видеть в моем примере кода, я создаю новый WaveOut каждый раз, когда нужно воспроизвести mp3. - person clamp; 25.09.2012
comment
Хорошо, может быть проблема с драйвером. Обычно вы можете создать несколько экземпляров WaveOut для одной и той же звуковой карты. - person Mark Heath; 25.09.2012
comment
Ага. может быть проблема в том, что ASIO не работает? Пишет, что у меня не установлен ASIO-драйвер. - person clamp; 25.09.2012