在 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) 文件的一部分的主要内容,如果未能解决你的问题,请参考以下文章