在 C# 中播放声音 (WMA) 文件的一部分

Posted

技术标签:

【中文标题】在 C# 中播放声音 (WMA) 文件的一部分【英文标题】:Playing part of a sound (WMA) file in C# 【发布时间】:2012-11-14 01:22:16 【问题描述】:

我有一个 WMA 文件,其中包含许多不同的音频片段。 有什么方法可以播放声音流的一部分吗?

类似:

public static void Play(Stream soundStream, long start, long end);

【问题讨论】:

这不是一个好主意。压缩格式有一个讨厌的习惯,就是不处理精确到毫秒的 seek(),所以你可能会留下“声音精灵”的缺失部分或之前的部分。 【参考方案1】:

您也许可以使用NAudio 来做到这一点,它是.Net 的音频库。

使用示例here 我能够抛出一个快速测试应用程序来尝试它。使用 WaveSteam.Skip(int seconds) 方法,您可以从文件中的特定位置开始。不过,我还没有弄清楚如何获得最终位置。以下是在 30 秒标记处启动 wma 文件的修改示例:

    IWavePlayer waveOutDevice = new WaveOut();
    WaveStream mainOutputStream;
    WaveChannel32 volumeStream;

    WaveStream wmaReader = new WMAFileReader(@"F:\My Music\The Prodigy\Music for the Jilted Generation\01 Intro.wma");
    volumeStream = new WaveChannel32(wmaReader);

    mainOutputStream = volumeStream;

    mainOutputStream.Skip(30); //start 30 seconds into the file
    waveOutDevice.Init(mainOutputStream);
    waveOutDevice.Play();

上面的示例省略了清理代码以停止播放并处理流。希望对您有所帮助。

【讨论】:

【参考方案2】:

不是你想要的方式,不。

我假设这是在 WinForms 或 WPF 上下文中。解决方案是在项目中托管 WMP ActiveX 控件,然后将 WMA 文件加载到其中并设置 Position/Seek 属性,然后播放一段时间并在 Timer 到达某个点时停止它。我不相信 WMP ActiveX 控件有计时器事件,因此您需要在另一个线程上观看它并在到达时停止播放。

这是一个 hack,但应该可以。如果您熟悉在 .NET 应用程序中托管 ActiveX 控件,您应该能够在几个小时内获得“有效”的东西。请注意,由于与 64 位 WMP ActiveX 控件的兼容性问题,您需要使应用程序仅支持 x86。

更难的替代方法是在您的应用程序中使用 DirectShow,并为 WMA 文件创建一个渲染图,然后自己进行操作、搜索和播放。 DS 的学习曲线非常陡峭,如果您以前从未使用过 COM,预计这至少需要几天甚至几周的时间。

【讨论】:

以上是关于在 C# 中播放声音 (WMA) 文件的一部分的主要内容,如果未能解决你的问题,请参考以下文章

用 C++ 播放声音?

如何一次播放多个 mp3/wma 文件?

在 CF.NET 2.0 中播放 WMA 文件

使用 c# wpf 从资源文件播放声音

C# WINFROM怎么播放声音文件? 我把声音文件放在BIN目录下 结果报错说啥找不到文件

如何在c#中播放特定的Windows错误声音[重复]