我的节目应该在用户按下“播放”时播放视频。按钮。虽然它通常会这样做,但他们第一次按下“播放”按钮。按钮什么都不会发生。
我已将此错误追溯到以下代码,该代码设置了我的MediaElement' VideoPlayer':
public void playVideo_Tapped(object sender, TappedRoutedEventArgs e)
{
setUpVideo();
VideoPlayer.Play();
}
public async void setUpVideo()
{
if(vm == null) return;
StorageFile videoFile = vm.videoFile;
if (videoFile == null || !videoFile.ContentType.Equals("video/mp4")) return;
using (IRandomAccessStream fileStream = await videoFile.OpenAsync(FileAccessMode.Read))
{
VideoPlayer.SetSource(fileStream, videoFile.ContentType);
}
}
罪魁祸首似乎是' SetSource()'最后的方法。唯一一个因第一次点击“播放”而变化的变量。接下来是变量' VideoPlayer.PlayToSource',它从null变为实际值。
(作为旁注,变量' VideoPlayer.CurrentState'也会从关闭'更改为'打开'但重置为'已关闭& #39;在第二次点击之前。只有' PlayToSource'更改功能。)
我认为我可以通过第一种方法快速修复:
setUpVideo();
setUpVideo();
VideoPlayer.Play();
不是很棒的代码,但它应该把事情做好,对吧?不!这会导致NullReferenceException。第二次打电话给' setUpVideo()'我发现' PlayToSource'仍然有一个值和' VideoPlayer.CurrentState'仍然设置为' Opening' ...以某种方式触发NullReferenceException。
我期待解决方案成为以下事项之一:
1。)设置' VideoPlayer.PlayToSource'在第一次点击之前调用' SetSource'。
2。)在快速修复中,设置' VideoPlayer.CurrentState'回到'关闭'在电话之间。
3。)其他一些模仿第一次点击正在做的事情。
当然,我的两个想法都涉及更改只读变量。这就是我被卡住的地方。我会包含.xaml代码,但我确信它是方法' SetSource'这是我烦恼的根源:
<Grid x:Name="VideoViewerParentGrid" Background="DarkGreen" Height="{Binding VideoViewerParentGridHeight }" Width="{Binding VideoViewerParentGridWidth}">
<MediaElement x:Name="VideoPlayer" HorizontalAlignment="Center" VerticalAlignment="Bottom" Stretch="Uniform"
Visibility="{Binding VideoVisibility, Converter={StaticResource visibilityConverter}}"/>
<Button Style="{StaticResource BackButtonStyle}" Tapped="VideoViewerClose_Tapped" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<Button Name="Play_Button" Content="Play Video" FontSize="26" Tapped="playVideo_Tapped"
VerticalAlignment="Top" HorizontalAlignment="Left" Height="60" Width="180" Margin="0,80,0,0"/>
</Grid>
----更新----
更多的戳戳表明,在第一次点击时,VideoPlayer.CurrentState&#39;永远不会到达&#39;播放&#39;国家,而不是来自&#39;开放&#39;回到&#39;关闭&#39;。只要程序正在运行,它就不会对任何后续点击执行此操作。仍在调查原因。
答案 0 :(得分:0)
你错过了&#34; await&#34;关键词。这样做: -
await setUpVideo();
答案 1 :(得分:0)
简短版本,通过更改此问题解决了此问题:
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而不是播放它。发生这种情况是因为当我离开“使用”代码块时,'IRandomAccessStream'会在我读取文件的过程中关闭。我不是100%清楚为什么它在第一次运行代码之后完成整个事情,但至少它现在可靠地运行。
我还得到了信用到期的信用,我在这里找到了这个答案:Windows 8 app - MediaElement not playing ".wmv" files