我在尝试使用 Windows 窗体 C# 应用程序中的
Windows.Media.Playback
功能播放简单的 mp4 视频文件时遇到问题。根据文档上的示例,这应该非常简单:https://learn.microsoft.com/en-us/windows/uwp/audio-video-camera/play-audio-and-video-with-mediaplayer
我有简单的 Windows 窗体应用程序,可以启动播放器并在消息框中显示播放器的状态和可能的错误。
MessageBox
上的消息显示正在播放状态,没有任何显示,但可以听到视频的声音。我认为这与未为 MediaPlayer
配置 ui 组件有关。页面上有一些 Use MediaPlayerElement to render video in XAML
xaml 示例,尽管(据我了解)应该为媒体播放器创建一个窗口,但我不知道如何将此类 xaml 放入这个简约的 C# Forms 应用程序中。我需要让视频图像也显示在一个简单的窗口上(启动一个新窗口)。除了 Windows 窗体之外,我对任何其他 Windows ui 相关内容没有 0 经验,而且我对此很困惑,因为我找不到任何关于如何在 Visual 中将 XAML 窗口添加到此类 C# Windows 窗体应用程序的简单示例工作室。
using Windows.Media.Core;
using Windows.Media.Playback;
public partial class Form1 : Form
{
MediaPlayer p;
public Form1()
{
p = new MediaPlayer();
p.MediaFailed += failure;
InitializeComponent();
}
static void failure(MediaPlayer p, MediaPlayerFailedEventArgs a) {
MessageBox.Show(a.ErrorMessage, "Error");
}
private void button1_Click(object sender, EventArgs e)
{
p.Source = MediaSource.CreateFromUri(new Uri("C:/sfc.mp4"));
p.Play();//Start the media player
MessageBox.Show(p.CurrentState.ToString(), "Player state");//Says "Opening"
//Wait for few seconds
MessageBox.Show(p.CurrentState.ToString(), "Player state");//Says "Playing" and we get sound output
}
}
它实际上在 WPF 中简化了很多
首先,只需使用 MediaElement
<StackPanel Orientation="Horizontal" Name="topPanel">
<Button Name="browseMediaButton" Click="browseMediaButton_Click" Margin="5,0" Padding="3,1" MinWidth="50">Select Video File</Button>
<Label Name="messageLabel" Foreground="Red" FontSize="16"></Label>
</StackPanel>
<Grid Name="videoGrid" Grid.Row="1">
<MediaElement x:Name="mediaVideo" Source="" LoadedBehavior="Manual" UnloadedBehavior="Stop" />
</Grid>
然后在您的代码中,打开文件后,播放它
private void browseMediaButton_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
ofd.CheckPathExists = true;
ofd.Multiselect = true;
bool? result = ofd.ShowDialog();
if (result == true)
{
messageLabel.Content = "";
mediaVideo.Source = new Uri(ofd.FileName);
mediaVideo.Play();
}
}