'MediaElement.CurrentState' 正在更改为 'Closed',原因不明

'MediaElement.CurrentState' is changing to 'Closed' for unknown reasons

我的程序应该在用户点击 'Play' 按钮时播放视频。然而,第一次点击 'Play' 什么也没做。

此代码非常简单,它只是在我的 MediaElement、VideoPlayer 上调用 'SetSource',然后播放:

private async void playVideo_Tapped(object sender, TappedRoutedEventArgs e)
{
    await setUpVideo();
    VideoPlayer.Play();
}

我已经经历了 'setUpVideo()' 无数次,一切正常,只有在确保文件存在后才会调用 'VideoPlayer.SetSource()'。直到我扔了一个监控'VideoPlayer.CurrentState'状态的方法,我才意识到问题所在:

public VideoViewer()
{
    this.InitializeComponent();
    VideoPlayer.CurrentStateChanged += VideoPlayer_CurrentStateChanged;
}

void VideoPlayer_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    var foo = VideoPlayer.CurrentState;
}

如果我在代码运行时检查 'foo' 的值,我会在第一次点击时看到(并且只有第一次点击)'VideoPlayer.CurrentState' 在 [=31 之后更改为 'Opening' =] 完成,然后变回 'Closed'!此后的每次点击都将遵循 'Opening' 到 'Playing' 然后 'Paused' 的正确进程,但第一次点击总是关闭。这是为什么??

看来问题毕竟出在 'setUpVideo()' 中。糟糕。

简短版本,此问题已通过更改 'setUpVideo()' 中的一段代码解决:

using (IRandomAccessStream fileStream = await videoFile.OpenAsync(FileAccessMode.Read))
{
  VideoPlayer.SetSource(fileStream, videoFile.ContentType);
}

...为此:

IRandomAccessStream fileStream = await videoFile.OpenAsync(FileAccessMode.Read);
VideoPlayer.SetSource(fileStream, videoFile.ContentType);

更长的版本,我的代码因错误 "mf_media_engine_err_src_not_supported hresult - 0xc00d36c4" 而失败,该错误正在关闭我的 MediaElement 而不是播放它。发生这种情况是因为当我离开 'using' 代码块时,'IRandomAccessStream' 会在我读取文件的过程中关闭。我不是 100% 清楚为什么它在第一个 运行 代码之后完成整个过程,但至少它现在可以可靠地工作。

我还必须在信用到期时给予信用,我在这里找到了这个答案:Windows 8 app - MediaElement not playing ".wmv" files