在Windows手机上同时播放声音

时间:2013-10-28 21:35:53

标签: c# windows-phone-7 audio windows-phone-8

首先,我想说我已经阅读了与我的问题相关的所有主题,在stackoverflow上(当然还有googled),但这些研究没有解决我的问题。 我正在为Windows Phone编写应用程序,我需要同时播放两个声音,但是这段代码不起作用,因为两个声音之间存在轻微但明显的差异,并且我的项目中一定没有明显的延迟。

Stream s1 = TitleContainer.OpenStream("C.wav");
Stream s2 = TitleContainer.OpenStream("C1.wav");
SoundEffectInstance sci = sc.CreateInstance();
SoundEffectInstance sci1 = sc1.CreateInstance();
sci.Play();
sci1.Play();

我还尝试执行两个wav文件的简单混合,但由于我不知道的原因它不起作用。 (ArgumentException - 确保指定的流包含有效的PCM单声道或立体声波数据。 - 在调用SoundEffect.FromStream时抛出(WAVEFile.Mix(s1,s2));

    public static Stream Mix(Stream in1,Stream in2)
    {
        BinaryWriter bw;
        bw = new BinaryWriter(new MemoryStream());
        byte[] header = new byte[44];
        in1.Read(header, 0, 44);
        bw.Write(header);
        in2.Seek(44, SeekOrigin.Begin);
        BinaryReader r1 = new BinaryReader(in1);
        BinaryReader r2 = new BinaryReader(in2);
        while (in1.Position != in1.Length)
        {
            bw.Write((short)(r1.ReadInt16() + r2.ReadInt16()));
        }
        r1.Dispose();
        r2.Dispose();
        bw.BaseStream.Seek(0, SeekOrigin.Begin);
        return bw.BaseStream;
    }

Stream s1 = TitleContainer.OpenStream("C.wav");
Stream s2 = TitleContainer.OpenStream("C1.wav");
s3 = SoundEffect.FromStream(WAVEFile.Mix(s1, s2));

那么,有人知道当时如何播放两种声音吗?

1 个答案:

答案 0 :(得分:0)

所以你的第一个解决方案应该工作。我有另一种解决方案非常类似于我知道的工作方式。

static Stream stream1 = TitleContainer.OpenStream("soundeffect.wav");
static SoundEffect sfx = SoundEffect.FromStream(stream1);
static SoundEffectInstance soundEffect = sfx.CreateInstance();

public void playSound(){
    FrameworkDispatcher.Update();
    soundEffect.Play();
}

您的第二个解决方案无法正常工作的原因是因为Windows手机可以播放非常具体的文件格式。

支持的格式列表

http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff462087(v=vs.105).aspx

此代码的参考是我的博客

http://www.anthonyrussell.info/postpage.php?name=60

修改

您可以在此处看到上述解决方案

http://www.windowsphone.com/en-us/store/app/xylophone/fe4e0fed-1130-e011-854c-00237de2db9e

编辑#2

为了回应下面的评论,这段代码不起作用,我还在我的博客上发布了一个可以实现这个代码的工作,发布的应用程序。它被称为Xylophone,它是免费的,您可以在页面底部下载代码。

http://anthonyrussell.info/postpage.php?name=60