如何在C# WPF应用中无需下载播放远程OGG音频文件
在C# WPF中用NAudio直接播放远程OGG音频
问题分析
你之前的两种方案无法正常工作的核心原因:
- 第一种用
MediaFoundationReader的代码:Media Foundation原生不支持OGG/Vorbis格式,传入OGG URL时无法解析音频数据,导致方法直接退出。 - 第二种用
VorbisWaveReader(url)的代码:VorbisWaveReader的URL构造函数仅支持本地文件路径,无法直接读取远程HTTP流,因此无法处理远程OGG资源。
解决方案
要直接播放远程OGG音频,需要先通过HTTP获取音频流,再将流传入VorbisWaveReader处理,最后用播放设备输出。以下是修正后的可运行代码:
步骤1:安装依赖包
通过NuGet安装NAudio和NAudio.Vorbis两个包。
步骤2:实现远程OGG播放逻辑
using NAudio.Wave; using NAudio.Vorbis; using System.Net.Http; using System.Threading.Tasks; public async Task PlayRemoteOggAudioAsync(string oggUrl) { // 初始化HttpClient获取远程音频流 using var httpClient = new HttpClient(); using var audioStream = await httpClient.GetStreamAsync(oggUrl); // 用VorbisWaveReader解析OGG格式流 using var vorbisReader = new VorbisWaveReader(audioStream); using var waveOut = new WaveOutEvent(); // 初始化播放设备并启动播放 waveOut.Init(vorbisReader); waveOut.Play(); // 将播放实例加入管理集合 PlayingAudioWaveOutEvent.Add(waveOut); // 通过事件监听播放完成,替代轮询方式 var playbackCompletion = new TaskCompletionSource<bool>(); void OnPlaybackStopped(object sender, StoppedEventArgs e) { playbackCompletion.TrySetResult(true); waveOut.PlaybackStopped -= OnPlaybackStopped; } waveOut.PlaybackStopped += OnPlaybackStopped; // 等待播放结束 await playbackCompletion.Task; // 从管理集合移除实例 PlayingAudioWaveOutEvent.Remove(waveOut); }
关键细节说明
- 流式获取音频:通过
HttpClient.GetStreamAsync获取远程音频的流式数据,无需提前下载整个文件,符合你“无需下载直接播放”的需求。 - 播放状态监听:使用
PlaybackStopped事件替代轮询PlaybackState,减少资源消耗,逻辑更简洁可靠。 - 资源自动释放:所有实现
IDisposable的对象都用using语句包裹,确保播放结束后资源被正确回收。
内容的提问来源于stack exchange,提问作者ZoneArisKzae
相关产品推荐
相关产品推荐

