首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中播放部分声音(WMA)文件

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

Stack Overflow用户
提问于 2012-11-14 09:22:17
回答 2查看 3.2K关注 0票数 1

我有一个单一的WMA文件,其中包含许多不同的音频片段。有没有办法让我播放一部分声音流?

类似于:

代码语言:javascript
复制
public static void Play(Stream soundStream, long start, long end);
EN

回答 2

Stack Overflow用户

发布于 2012-11-14 11:23:36

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

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

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 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,预计这将花费你至少几天甚至几周的时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13371717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档