'MediaElement.SetSource()' 没有持续更新
本文关键字:更新 MediaElement SetSource | 更新日期: 2024-11-06 20:34:14
当用户按下"播放"按钮时,我的程序应该播放视频。虽然它通常会这样做,但当他们第一次按下"播放"按钮时,什么都不会发生。
我已经将此错误追溯到以下代码,该代码将我的MediaElement设置为"视频播放器":
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",它从空值更改为实际值。
(作为旁注,变量"VideoPlayer.CurrentState"也从"关闭"更改为"打开",但在第二次点击之前重置为"关闭"。只有"PlayToSource"会更改功能。
我想我可以通过在我的第一种方法中执行此操作来快速修复:
setUpVideo();
setUpVideo();
VideoPlayer.Play();
不是很好的代码,但它应该把事情弄清楚,对吧?不!这会导致 NullReferenceException。在第二次调用"setUpVideo()"时,我发现"PlayToSource"仍然具有值,而"VideoPlayer.CurrentState"仍设置为"打开"...它以某种方式触发了 NullReferenceException。
我希望解决方案是以下之一:
1.)在调用"SetSource"之前,在第一次点击时设置"VideoPlayer.PlayToSource"。
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"从未达到"正在播放"状态,而是从"打开"直接回到"关闭"。只要程序正在运行,它就不会在任何后续点击中执行此操作。仍在调查原因。
您缺少"等待"关键字。这样做:-
await 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应用程序 - MediaElement不播放".wmv"文件