首頁>Program>source

有没有办法同時播放两个声音?

我知道那个 無法做到這一點。 我不能用 SoundPlayer 我相信它只是XNA的一部分。

所需的两種声音將在未知和隨機的時間被呼叫.播放後需要控製声音.也就是說,声音必须能够在播放完毕之前停止。

SoundEffect
最新回復
  • 5月前
    1 #

    參考 PresentationCoreWindowsBase 尝試一下...

    var p1 = new System.Windows.Media.MediaPlayer();
    p1.Open(new System.Uri(@"C:\windows\media\tada.wav"));
    p1.Play();
    // this sleep is here just so you can distinguish the two sounds playing simultaneously
    System.Threading.Thread.Sleep(500);
    var p2 = new System.Windows.Media.MediaPlayer();
    p2.Open(new System.Uri(@"C:\windows\media\tada.wav"));
    p2.Play();
    

    EDIT 我收到一张低票,可能是因為乍一看,它看起来像是在第一个声音播放完後便会播放第二个声音.並非如此,它们由windows異步播放.睡眠在那裏,因此,如果您逐字測試此代碼,您可以听到声音一起播放的声音,没有延迟就不会引起註意,因為它们是相同的声音。

    此代碼演示了两種声音在彼此之上的單独執行緒上播放的情况,這毫無意義,因為播放始终不会受到阻礙

    new System.Threading.Thread(() => {
            var c = new System.Windows.Media.MediaPlayer();
            c.Open(new System.Uri(@"C:\windows\media\tada.wav"));
            c.Play();
        }).Start();
    System.Threading.Thread.Sleep(500);
    new System.Threading.Thread(() => {
            var c = new System.Windows.Media.MediaPlayer();
            c.Open(new System.Uri(@"C:\windows\media\tada.wav"));
            c.Play();
        }).Start();
    

    http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer.stop.aspx 该類還具有停止播放所需的控制元件

  • 5月前
    2 #

    即使建立了两个例項," MediaPlayer"物件也不允许您一次播放两種声音.您將需要引入本地windows API" mciSendString"。

       [DllImport("winmm.dll")]
        static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);
        public Form1()
        {
            InitializeComponent();
            mciSendString(@"open C:\Users\Jono\Desktop\applause.wav type waveaudio alias applause", null, 0, IntPtr.Zero);
            mciSendString(@"play applause", null, 0, IntPtr.Zero);
            mciSendString(@"open C:\Users\Jono\Desktop\foghorn.wav type waveaudio alias foghorn", null, 0, IntPtr.Zero);
            mciSendString(@"play foghorn", null, 0, IntPtr.Zero);
        }
    

  • 5月前
    3 #

    檢查 PlaySound 此處的方法http://msdn.microsoft.com/zh-cn/library/aa909766.aspx及其標志 SND_ASYNC

  • 5月前
    4 #

    解決方案: 你好 我正在開發wP8 App,我需要同時播放多種声音,上述解決方案對我而言不起作用,因此我使用了XNA框架.這是鏈接

    http://msdn.microsoft.com/en-us/library/ff842408.aspx

    然後播放這樣的声音檔案...

    SoundEffect Sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Assets/Sounds/wav/sound.wav", UriKind.Relative)).Stream);
    Sound.Play();
    

    用於迴圈...

    SoundEffectInstance Sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Assets/Sounds/wav/sound.wav", UriKind.Relative)).Stream).CreateInstance();
    Sound.IsLooped = true;
    Sound.Play();
    

    註意:檔案必须采用" .wav"格式(PCM,8位或16位,8KHz至48KHz,單声道或立體声)格式

  • 5月前
    5 #

    来自http://alvas.net/alvas .audio,samples.aspx#sample7和http://alvas.net/alvas.audio,samples.aspx#sample6

    Player pl = new Player();
    byte[] arr = File.ReadAllBytes(@"in.wav");
    pl.Play(arr);
    Player pl2 = new Player();
    pl2.FileName = "123.mp3";
    pl2.Play();
    

    或在播放之前混合音频資料。如何混合以混合两个音频檔案。

    private void Mix(string outfile, string infile1, string infile2, int shiftSec)
    {
        WaveReader wr1 = new WaveReader(File.OpenRead(infile1));
        WaveReader wr2 = new WaveReader(File.OpenRead(infile2));
        IntPtr format1 = wr1.ReadFormat();
        WaveFormat wf = AudioCompressionManager.GetWaveFormat(format1);
        WaveWriter ww = new WaveWriter(File.Create(outfile), AudioCompressionManager.FormatBytes(format1));
        byte[] data0 = wr1.ReadData(0, shiftSec);
        byte[] data1 = wr1.ReadData(shiftSec);
        byte[] data2 = wr2.ReadData();
        byte[] mixData = AudioCompressionManager.Mix(format1, data2, data1);
        ww.WriteData(data0);
        ww.WriteData(mixData);
        ww.Close();
        wr2.Close();
        wr1.Close();
    }
    

  • r:拆分"…"引數並分配给多个函式
  • c#:遵守順序的Foo物件列表的良好GetHashCode()重寫