Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中以低延迟/极低延迟播放音频文件?_C#_Audio_Parallel Processing_Mp3 - Fatal编程技术网

如何在C#中以低延迟/极低延迟播放音频文件?

如何在C#中以低延迟/极低延迟播放音频文件?,c#,audio,parallel-processing,mp3,C#,Audio,Parallel Processing,Mp3,如何以C#格式播放音频文件(.mp3),并且几乎没有延迟?我的意思是,文件应该在提供用户输入之后开始播放,然后再播放 另外,如何同时并行播放两个音频文件 看看图书馆 要同时播放多个文件,请参见。要获得尽可能小的延迟,您需要在没有/静音数据的情况下运行音频播放,并且在感兴趣的事件中,您将向已激活的设备提供真实的播放数据。这样,您就消除了激活音频播放设备的开销。开销并没有那么大,所以您可能不希望应用程序过于复杂 可以选择播放音频的API,尤其是NAudio 除非您打算在独占模式下使用播放设备(您不太

如何以C#格式播放音频文件(.mp3),并且几乎没有延迟?我的意思是,文件应该在提供用户输入之后开始播放,然后再播放

另外,如何同时并行播放两个音频文件

看看图书馆


要同时播放多个文件,请参见。

要获得尽可能小的延迟,您需要在没有/静音数据的情况下运行音频播放,并且在感兴趣的事件中,您将向已激活的设备提供真实的播放数据。这样,您就消除了激活音频播放设备的开销。开销并没有那么大,所以您可能不希望应用程序过于复杂

可以选择播放音频的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,如果在并行流上正确、准确地对数据进行时间戳,也可以实现完美的混合。