如何在C#中以低延迟/极低延迟播放音频文件?
如何以C#格式播放音频文件(.mp3),并且几乎没有延迟?我的意思是,文件应该在提供用户输入之后开始播放,然后再播放 另外,如何同时并行播放两个音频文件 看看图书馆如何在C#中以低延迟/极低延迟播放音频文件?,c#,audio,parallel-processing,mp3,C#,Audio,Parallel Processing,Mp3,如何以C#格式播放音频文件(.mp3),并且几乎没有延迟?我的意思是,文件应该在提供用户输入之后开始播放,然后再播放 另外,如何同时并行播放两个音频文件 看看图书馆 要同时播放多个文件,请参见。要获得尽可能小的延迟,您需要在没有/静音数据的情况下运行音频播放,并且在感兴趣的事件中,您将向已激活的设备提供真实的播放数据。这样,您就消除了激活音频播放设备的开销。开销并没有那么大,所以您可能不希望应用程序过于复杂 可以选择播放音频的API,尤其是NAudio 除非您打算在独占模式下使用播放设备(您不太
要同时播放多个文件,请参见。要获得尽可能小的延迟,您需要在没有/静音数据的情况下运行音频播放,并且在感兴趣的事件中,您将向已激活的设备提供真实的播放数据。这样,您就消除了激活音频播放设备的开销。开销并没有那么大,所以您可能不希望应用程序过于复杂 可以选择播放音频的API,尤其是NAudio
除非您打算在独占模式下使用播放设备(您不太可能希望这样做),否则所有API都支持多个独立流的播放,并且所有混音都会在后台自动完成。我将向您展示如何使用DirectX AudioVideoPlayback执行此操作:
public class MusicPlayer
{
private static Audio m_Audio;
private static void Loop(Object Sender, EventArgs e)
{
((Audio)Sender).SeekCurrentPosition(0d, SeekPositionFlags.AbsolutePositioning);
}
public static void Dispose()
{
if (m_Audio != null)
{
m_Audio.Stop();
m_Audio.Dispose();
m_Audio = null;
}
}
public static void Mute()
{
if ((m_Audio != null) && m_Audio.Playing)
m_Audio.Volume = -10000;
}
public static void Play(String filePath, Boolean loop)
{
if (File.Exists(filePath))
{
Dispose();
if (m_Audio == null)
m_Audio = new Audio(filePath);
else
m_Audio.Open(filePath);
if (loop)
m_Audio.Ending += Loop;
m_Audio.Volume = MusicSettings.Volume - 10000;
m_Audio.Play();
}
}
public static void Unmute()
{
if (m_Audio != null)
m_Audio.Volume = MusicSettings.Value - 10000;
}
}
你可以从这段代码开始。如果“并行”实际上意味着“在完全相同的时间开始,这样用户就看不出有什么不同”,那么不,你将永远无法实现这一点。人类的耳朵对时间差异非常敏感,可以告诉它狮子的位置。虽然Hans所写的是正确的,但使用DirectShow API,如果在并行流上正确、准确地对数据进行时间戳,也可以实现完美的混合。