You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:45:51