使用Vorbis和NAudio在c#中播放OGG文件



我正在尝试使用NVorbisNAudio播放OGG文件流,如文档中所述,我试图在单击按钮时运行此代码,但我得到一个异常:

系统。参数异常:'无法初始化容器! ''

我的目标。net Framework 4.5

下面是我的代码:
private void button1_Click(object sender, EventArgs e)
{
using (var vorbisStream = new NAudio.Vorbis.VorbisWaveReader(@"OGG file path"))
using (var waveOut = new NAudio.Wave.WaveOutEvent())
{
waveOut.Init(vorbisStream);
waveOut.Play();

// wait here until playback stops or should stop
}
}

有两个问题:

  • 第一个是你不能用using声明WaveOutReader或WaveOut对象,因为后者是异步播放声音,它需要WaveOutReader的流打开
  • 你的目标是。net Framework 4.5,它不适合处理NAudioNVorbis的当前版本

我假设你已经成功安装了NAudio 2.1.0和NAudio。新的。net 6+项目中的Vorbis 1.5.0包。
你只需要添加NAudio.VorbisNAudio.Wave的引用

针对。net 6+,启用nullable

为表单添加两个按钮控件,一个名为btnPlayAudio,另一个名为btnStopPlayback,最初禁用;使用这里所示的事件处理程序订阅它们的Click事件。

作为播放器的WaveOutReader和WaveOut对象被声明为实例字段,初始设置为null

当你按下播放音频按钮时,音频流和播放器被初始化,调用WaveOutInit()方法,这也订阅了WaveOut对象的PlaybackStopped事件。
当您调用WaveOut对象的Stop()方法或OGG播放终止时,将引发此事件。这里,Stop()方法是在btnStopPlayback点击处理程序中调用的。

当这种情况发生时,调用另一个方法WaveOutReset();这个方法处理WaveOut对象和WaveOutReader的Stream。事件处理程序也被删除。

using NAudio.Vorbis;
using NAudio.Wave;
public partial class MainForm : Form {
private VorbisWaveReader? vorbis = null;
private WaveOut? oggPlayer = null;
private void btnPlayAudio_Click(object sender, EventArgs e)
{
btnPlayAudio.Enabled = false;
btnStopPlayback.Enabled = true;
vorbis = new VorbisWaveReader("OGG File path"));
oggPlayer = WaveOutInit(vorbis);
oggPlayer.Play();
}
private void btnStopPlayback_Click(object sender, EventArgs e)
{
oggPlayer?.Stop();
btnStopPlayback.Enabled = false;
}
private void WaveOut_PlaybackStopped(object? sender, StoppedEventArgs e)
{
WaveOutReset(oggPlayer, vorbis);
btnPlayAudio.Enabled = true;
}
private WaveOut WaveOutInit(IWaveProvider reader)
{
var waveOut = new WaveOut();
waveOut.PlaybackStopped += WaveOut_PlaybackStopped;
waveOut.Init(reader);
return waveOut;
}
private void WaveOutReset(WaveOut? player, VorbisWaveReader? reader)
{
if (player != null) {
player.PlaybackStopped -= WaveOut_PlaybackStopped;
player.Dispose();
}
reader?.Dispose();
}
}

最新更新