在.net / c#中播放音频
本文关键字:播放 音频 net | 更新日期: 2023-09-27 18:02:22
我是一个有多年经验的MFC程序员,最近几年一直在Mac和iOS中开发商业应用程序-我正在努力跟上。net和c#的速度(因为我很快就要被要求将我的一个商业应用程序从Mac转换到PC)。
我现在已经完成了几本书,作为练习,以更加熟悉。net(和c#)我已经决定在我的一个非商业应用程序转换为。net作为一个学习练习,一切都很顺利(接口工作,数据结构都很好),但我需要能够播放音频。
我的Mac应用程序从一系列数学公式生成音频-想象一个波浪发生器-不完全相同但相似。在Mac上,我将音频生成为16位签名的原始音频,使用Core audio设置音频输出路由,然后在音频路由需要新的音频缓冲区时获得回调(因此我可以动态生成音频)。
我需要在PC上做同样的事情。不幸的是,我发现MSDN文档是一种"只见树木不见树木"的情况,因为有如此大量的文档。我可以找到可以让我加载和播放mp3/wav等文件的类,但我需要实时生成音频。有人能给我指出正确的方向,找到一些东西,让我在飞行中填补缓冲区,因为它播放他们?
Thx
我在几个项目中使用了这个示例,效果很好。它基本上是使用P/Invoke的Windows波形音频API的。net包装。其他选择:
- NAudio
- 声音播放器类来自。net框架
我已经创建了一个类,可以播放音频给定Stream
衍生作为输入。因此,如果您能够将您的声音发生器打包到Stream
兼容接口中,那么它可能适合您。
我是如何做到的-我使用非管理的waveOut*
方法从旧的Windows多媒体API,并处理从那里播放。
其他选项-我知道-直接使用waveOut
,从这个:http://windowsmedianet.sourceforge.net/或编写自己的DirectShow源过滤器,但这可能太复杂了,因为它必须用c++编写。
如果你有兴趣给我的组件一个尝试,我可以让它免费提供给你,因为我需要它测试(我只在我的几个项目中使用它)。
编辑:由于这个问题有6个赞成,我在这里免费提供我的组件(如果你觉得有用):http://dl.dropbox.com/u/10020780/SimpleAudioPlayer.zip
也许你可以反思一下:)
我用Audiere来完成这个任务,发现它工作得很好。
它实际上是一个c++库,但是有一组c#可用的绑定。
>
你应该看看FMOD,它允许这种操作和更多。它也是跨平台的,如果你也在mac上工作,你可能会感兴趣。
Alvas。Audio有3个音频播放器:Player
player.FileName = "123.mp3";
player.Play();
PlayerEx
public static void TestPlayerEx()
{
PlayerEx plex = new PlayerEx();
plex.Done += new PlayerEx.DoneEventHandler(plex_Done);
Mp3Reader mr = new Mp3Reader(File.OpenRead("in.mp3"));
IntPtr format = mr.ReadFormat();
byte[] data = mr.ReadData();
mr.Close();
plex.OpenPlayer(format);
plex.AddData(data);
plex.StartPlay();
}
static void plex_Done(object sender, DoneEventArgs e)
{
if (e.IsEndPlaying)
{
((PlayerEx)sender).ClosePlayer();
}
}
和RecordPlayer
public static void TestRecordPlayer()
{
RecordPlayer rp = new RecordPlayer();
rp.PropertyChanged += new PropertyChangedEventHandler(rp_PropertyChanged);
rp.Open(new Mp3Reader(File.OpenRead("in.mp3")));
rp.Play();
}
static void rp_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case RecordPlayer.StateProperty:
RecordPlayer rp = ((RecordPlayer)sender);
if (rp.State == DeviceState.Stopped)
{
rp.Close();
}
break;
}
}