1

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

就像是:

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

2 回答 2

2

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

使用此处的示例,我能够抛出一个快速测试应用程序来尝试它。使用 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();

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

于 2012-11-14T03:23:35.823 回答
1

不是你想要的方式,不。

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

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

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

于 2012-11-14T01:41:35.580 回答