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

时间:2012-11-14 01:22:17

标签: c# windows audio wma

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

类似的东西:

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

2 个答案:

答案 0 :(得分:2)

您可以使用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();

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

答案 1 :(得分:1)

不是你想要的方式,不。

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

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

更难的替代方案是在应用程序中使用DirectShow并为WMA文件创建渲染图并自行进行操作,搜索和回放。 DS有一个非常陡峭的学习曲线,如果你以前从未使用过COM,那么预计这会带你至少几天甚至几周。