我有一个单一的WMA文件,其中包含许多不同的音频片段。有没有办法让我播放一部分声音流?
类似于:
public static void Play(Stream soundStream, long start, long end);发布于 2012-11-14 11:23:36
你可以使用NAudio来做到这一点,它是一个用于.Net的音频库。
使用示例here,我能够抛出一个快速测试应用程序来试用它。使用WaveSteam.Skip(int秒)方法,您可以从文件中的特定位置开始。不过,我还没能弄清楚如何获得最终的位置。下面是修改后的示例,它在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-14 09:41:36
不是你想要的方式,不是。
我假设这是在WinForms或WPF上下文中。解决方案是在您的项目中托管WMP ActiveX控件,然后将WMA文件加载到其中并设置Position/Seek属性,然后播放它一段时间,并在计时器到达特定点时停止它。我不相信WMP ActiveX控件有一个计时器事件,所以你需要在另一个线程上观看它,并在它到达时停止播放。
这是一个黑客,但应该可以工作。如果您熟悉在.NET应用程序中托管ActiveX控件,那么您应该能够在几个小时内获得一些“有效”的东西。请注意,由于与64位WMP ActiveX控件的兼容性问题,您需要将应用程序设置为仅支持x86。
更困难的替代方案是从你的应用程序中使用DirectShow,为WMA文件创建一个渲染图形,然后自己进行操作、查找和回放。DS有一个非常陡峭的学习曲线,如果你以前从未使用过COM,预计这将花费你至少几天甚至几周的时间。
https://stackoverflow.com/questions/13371717
复制相似问题