【问题标题】:C# Windows Phone 8 - Catastrophic Failure E_Unexpected when playing mediaC# Windows Phone 8 - 播放媒体时发生灾难性故障 E_Unexpected
【发布时间】:2015-03-20 17:06:09
【问题描述】:

这让我发疯了!当尝试在 windows phone 8 应用程序中播放声音或任何媒体元素时,我收到“灾难性故障(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 的一些问题。其他一切正常,只是在手机尝试播放媒体时崩溃。

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

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

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

起初我以为可能是资源没有复制,所以我将“复制到输出目录”设置为“始终复制”。没有效果。

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

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

这不是编解码器的问题,动画是 .wmv 文件,声音都是 .wav。任何 Windows 设备都应本机支持两者。

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

我正在为此拉扯头发。

谢谢,

-RW

【问题讨论】:

  • 你试过在源参数中使用'\'吗?
  • 我用属性下的下拉框设置源。源由视觉工作室填充。我确信它是正确的。

标签: c# windows-phone-8


【解决方案1】:

好的,我修好了。

当程序中有多个 MediaElement 时,Windows Phone 8.1 只是讨厌它......即使一次只播放一个也会引发错误并且不会播放任何声音。

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

解决方案是使用 SharpDX。

特别感谢这篇文章:Multiple audio stream in Universal App(Runtime API), XNA SoundEffect replacement

我删除了除一个 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 可以工作了。我的头发甚至开始重新长出来(尽管它正在重新变灰)。

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

【讨论】:

  • 很好的解决方案。 SharpDX 也可以播放 .mp3 吗?
猜你喜欢
  • 2016-03-21
  • 2014-07-18
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多