'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
我的程序应该在用户点击 '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