我正在尝试使用NVorbis
和NAudio
播放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,它不适合处理
NAudio
和NVorbis
的当前版本
我假设你已经成功安装了NAudio 2.1.0和NAudio。新的。net 6+项目中的Vorbis 1.5.0包。
你只需要添加NAudio.Vorbis
和NAudio.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();
}
}