C# Windows Phone 8 - 播放媒体时发生灾难性故障 E_Unexpected

C# Windows Phone 8 - Catastrophic Failure E_Unexpected when playing media

这让我发疯!当尝试在 windows phone 8 应用程序中播放声音或任何媒体元素时,我得到 "Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))"

这就是它所说的全部内容。如果我查看它显示的堆栈跟踪:在 Windows.UI.Xaml.Controls.MediaElement.Play()

示例代码为:

XAML:

MediaElement x:Name="sndClick" Source="Assets/Sounds/Click.wav" Volume="10" AutoPlay="False"

代码: sndClick.play();

我正在尝试将 Windows 8 应用程序移植到 Windows Phone 8。Windows 8 应用程序与完全相同的代码完美配合。这一定是 Windows Phone 的一些问题。其他一切正常,只是在 phone 尝试播放媒体时崩溃。

并非所有播放声音的元素都会使程序崩溃,除非您单击它们几次。有些元素总是在第一次点击时崩溃。没有声音播放,即使程序没有崩溃,但它从不播放任何声音。

一次(而且只有一次)它播放了其中一个动画文件 (.wmv) 的前几帧,然后崩溃了。

这是一个奇怪的问题。所有代码都是从正在运行的 Windows 8 程序复制而来的,除媒体外一切正常。如果我注释掉 sound.play()'s 并禁用媒体播放器,程序就可以正常工作。

起初我认为可能是资源没有复制,所以我将 "Copy to Output Directory" 设置为 "Always Copy"。没有效果。

我试过模拟器,也试过物理硬件,一切都一样。

不是资源问题,模拟器和硬件系统资源绰绰有余,整个app只有22mb的大小。

这不是编解码器问题,动画是.wmv 文件,声音都是.wav。两者都应在任何 windows 设备上得到原生支持。

我四处搜索,看到其他人也有类似的问题,但我还没有看到任何解决方案。有谁知道是什么导致了这个问题以及如何解决它?非常感谢。

我对此很紧张。

谢谢,

-RW

好的,我解决了。

Windows Phone 8.1 在程序中有多个 MediaElement 时简直讨厌它......即使一次只播放一个也会抛出错误并且不会播放任何声音。

这很烦人。更烦人的是,XNA 似乎不能在 8.1 中工作(至少我不能让它工作)

解决方案是使用 SharpDX。

特别感谢post:Multiple audio stream in Universal App(Runtime API), XNA SoundEffect replacement

我删除了除一个 MediaElement 之外的所有 MediaElement,并从包安装程序中添加了已安装的 SharpDX 和 SharpDX Xaudio2。那么:

using SharpDX;
using SharpDX.XAudio2;
using SharpDX.IO;
using SharpDX.Multimedia;

private void PlaySound(string strPath)
{
    XAudio2 xAudio = new XAudio2();
    var masteringVoice = new MasteringVoice(xAudio);
    var nativeFileStream = new NativeFileStream(strPath, NativeFileMode.Open, NativeFileAccess.Read, NativeFileShare.Read);

    SoundStream stream = new SoundStream(nativeFileStream);
    var waveFormat = stream.Format;
    AudioBuffer buffer = new AudioBuffer
    {
        Stream = stream.ToDataStream(),
        AudioBytes = (int)stream.Length,
        Flags = BufferFlags.EndOfStream
    };

    var sourceVoice = new SourceVoice(xAudio, waveFormat, true);


    sourceVoice.SubmitSourceBuffer(buffer, stream.DecodedPacketsInfo);
    sourceVoice.Start();
    }

然后就是:

PlaySound("Assets/Sounds/Click.wav");

效果很好!我现在需要制作动画的剩余 MediaElement 可以正常工作。我的头发甚至开始长回来(虽然它正在长回灰色)。

如果其他人遇到此问题,这就是解决方法。我希望它对某人有所帮助。