【发布时间】:2014-08-11 17:31:13
【问题描述】:
在我的 WPF 项目中,我创建了一个视图,其中包含多个播放视频的 MediaElement。有时,一个或所有 MediaElement 之间的任何位置都无法播放分配给它们的视频,而是显示一个黑色矩形,或者根本不出现。发生这种情况时不会发生 MediaFailed 事件。 MediaOpened 事件确实会在所有 MediaElement 上引发,即使它们不播放视频也是如此。
我已为我的显卡安装了最新的驱动程序,但对这个问题没有任何影响。
是否有我可以使用的程序来确保每个 MediaElement 始终如一地播放?
示例源代码如下。包含视频文件的完整示例项目位于 github 上 https://github.com/duggulous/MediaElementIssueExample
MainWindow.xaml
<Window x:Class="VideoDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="1920" Width="1080">
<Grid Name="rootContainer" Background="Pink">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="404" />
<ColumnDefinition Width="136" />
<ColumnDefinition Width="136" />
<ColumnDefinition Width="134" />
<ColumnDefinition Width="270" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="270" />
<RowDefinition Height="30" />
<RowDefinition Height="412" />
<RowDefinition Height="416"/>
<RowDefinition Height="526"/>
<RowDefinition Height="264"/>
</Grid.RowDefinitions>
<MediaElement x:Name="panel1" Margin="-1"
Grid.Column="0" Grid.Row="0"
Grid.ColumnSpan="2" Grid.RowSpan="2"
Source="media/1-ekg.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel2" Margin="-1"
Grid.Column="2" Grid.Row="0"
Grid.ColumnSpan="3" Grid.RowSpan="1"
Source="media/2-star.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel3" Margin="-1"
Grid.Column="0" Grid.Row="2"
Grid.ColumnSpan="2" Grid.RowSpan="1"
Source="media/3-verticalLines.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel4" Margin="-1"
Grid.Column="2" Grid.Row="1"
Grid.ColumnSpan="2" Grid.RowSpan="2"
Source="media/4-horizLines.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel5" Margin="-1"
Grid.Column="4" Grid.Row="1"
Grid.ColumnSpan="1" Grid.RowSpan="2"
Source="media/5-curvedLines.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel6" Margin="-1"
Grid.Column="0" Grid.Row="3"
Grid.ColumnSpan="1" Grid.RowSpan="1"
Source="media/6-glassCircles.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel7" Margin="-1"
Grid.Column="1" Grid.Row="3"
Grid.ColumnSpan="2" Grid.RowSpan="1"
Source="media/7-diagZigZag.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel8" Margin="-1"
Grid.Column="3" Grid.Row="3"
Grid.ColumnSpan="2" Grid.RowSpan="1"
Source="media/8-glassBurst.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel9" Margin="-1"
Grid.Column="0" Grid.Row="4"
Grid.ColumnSpan="1" Grid.RowSpan="2"
Source="media/9-wavyLines.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel10" Margin="-1"
Grid.Column="1" Grid.Row="4"
Grid.ColumnSpan="4" Grid.RowSpan="1"
Source="media/10-circle.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel11" Margin="-1"
Grid.Column="1" Grid.Row="5"
Grid.ColumnSpan="4" Grid.RowSpan="1"
Source="media/11-wavyShape.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
</Grid>
MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace VideoDemo
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void panel1_MediaOpened(object sender, RoutedEventArgs e)
{
Console.WriteLine("Opened: "+((MediaElement)sender).Source);
}
private void panel1_MediaFailed(object sender, ExceptionRoutedEventArgs e)
{
Console.WriteLine("Failed:"+((MediaElement)sender).Source);
}
private void panel1_MediaEnded(object sender, RoutedEventArgs e)
{
Console.WriteLine("Ended:"+((MediaElement)sender).Source);
}
}
}
【问题讨论】:
-
您的代码在我的 I3、4GB、intel 4600 显卡上运行良好。没有失败的理由。
-
这并不能完全回答问题,但供将来参考:当我从使用 H.264 mp4 切换到 wmv 格式的视频时,我不再遇到此问题。
标签: c# wpf video mediaelement ms-media-foundation