我在一个自定义UserControl中为我一直在制作的视频播放器控件设置了一个MediaElement
--播放/暂停按钮、滑块、剩余时间等。我将ScrubbingEnabled
设置为True
,这样我就可以根据SO post here向用户显示视频的第一帧,并且还使用Slider
元素来允许用户清理视频。
问题:我使用绑定来切换视频播放器的源。有时,如果我在播放视频时切换视频 *,MediaElement
会停止响应Play()
命令。即使在MediaFailed
事件中,也不会给出错误。调用Play()
(或Pause()
,然后Play()
)每次都失败。我可以在MediaElement
出现故障后切换视频源,然后它就会重新开始工作。
XAML:
<MediaElement LoadedBehavior="Manual" ScrubbingEnabled="True"
UnloadedBehavior="Stop"
MediaOpened="VideoPlayer_MediaOpened" x:Name="VideoPlayer"/>
字符串
相关控制代码:
public static DependencyProperty VideoSourceProperty =
DependencyProperty.Register("VideoSource", typeof(string), typeof(MediaElementVideoPlayer),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure,
new PropertyChangedCallback(OnSourceChanged)));
private static void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MediaElementVideoPlayer player = d as MediaElementVideoPlayer;
if (player != null)
{
player.Dispatcher.Invoke(() => {
if (player.VideoSource != null && player.VideoSource != "")
{
if (player._isPlaying)
{
player.VideoPlayer.Stop();
var uriSource = new Uri(@"/ImageResources/vid-play.png", UriKind.Relative);
player.PlayPauseImage.Source = new BitmapImage(uriSource);
player._isPlaying = false;
}
player.VideoPlayer.Source = new Uri(player.VideoSource);
}
});
}
}
private void VideoPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
Dispatcher.Invoke(() =>
{
VideoPlayer.Pause();
VideoPlayer.Position = TimeSpan.FromTicks(0);
Player.IsMuted = false;
TimeSlider.Minimum = 0;
// Set the time slider values & time label
if (VideoPlayer.NaturalDuration != null && VideoPlayer.NaturalDuration != Duration.Automatic)
{
TimeSlider.Maximum = VideoPlayer.NaturalDuration.TimeSpan.TotalSeconds;
TimeSlider.Value = 0;
double totalSeconds = VideoPlayer.NaturalDuration.TimeSpan.TotalSeconds;
_durationString = Utilities.numberSecondsToString((int)totalSeconds, true, true);
TimeLabel.Content = "- / " + _durationString;
}
});
}
型
如果我告诉视频自动播放所有的时间,播放器的工作100%的时间,奇怪的是。不幸的是,我需要视频暂停时,源设置。有人知道如何避免MediaElement
的随机,隐藏的故障,同时仍然交换视频,显示加载视频的第一帧,等等?
here和here的问题非常相似,但我的问题有不同的症状,因为我只使用1 MediaElement
。
2条答案
按热度按时间ds97pgxw1#
奇怪的是,如果将
ScrubbingEnabled
设置为False
,MediaElement
不再随机停止响应。禁用ScrubbingEnabled
会破坏第一帧的显示,并使Slider
元素不能很好地工作,所以下面是如何在保持这些功能的同时,不会有一个,呃,损坏的MediaElement
。显示第一帧:
字符串
在拖动滑块的同时开启视频的擦洗功能:
型
chhkpiq42#
自从引入ScrubbingEnabled属性以来,我还遇到了MediaFailed(MILAVERR_UnexpectedWmpFailure HRESULT:0x8898050C)。由于在Play()期间禁用它而仅在Stop()期间启用它,因此可靠性得到了提高。也就是说,切换文件时必须禁用ScrubbingEnabled。