VideoConcat/Views/VideoPreviewWindow.xaml.cs
2026-01-01 15:39:54 +08:00

171 lines
5.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
using MessageBox = System.Windows.MessageBox;
// 明确使用 WPF 的 OpenFileDialog避免与 Windows Forms 冲突
using OpenFileDialog = Microsoft.Win32.OpenFileDialog;
namespace VideoConcat.Views
{
/// <summary>
/// VideoPreviewWindow.xaml 的交互逻辑
/// </summary>
public partial class VideoPreviewWindow : Window
{
private DispatcherTimer _timer;
private bool _isPlaying = false;
public VideoPreviewWindow()
{
InitializeComponent();
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromMilliseconds(500);
_timer.Tick += Timer_Tick;
}
public void LoadVideo(string filePath)
{
try
{
if (string.IsNullOrEmpty(filePath))
{
MessageBox.Show("视频文件路径为空!", "错误", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (!File.Exists(filePath))
{
MessageBox.Show($"视频文件不存在:\n{filePath}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
// 重置播放器状态
VideoPlayer.Stop();
_isPlaying = false;
_timer?.Stop();
// 设置文件名
FileNameText.Text = Path.GetFileName(filePath);
// 创建 URI使用绝对路径
string fullPath = Path.GetFullPath(filePath);
// Uri 构造函数会自动处理本地文件路径
Uri videoUri = new Uri(fullPath, UriKind.Absolute);
// 加载视频MediaOpened 事件已在 XAML 中定义,这里直接设置源)
VideoPlayer.Source = videoUri;
// 由于 MediaOpened 事件在 XAML 中已定义,视频加载完成后会自动触发
// 如果需要立即播放,可以在 MediaOpened 事件处理中处理
}
catch (UriFormatException ex)
{
MessageBox.Show($"视频文件路径格式错误:\n{ex.Message}\n\n文件路径{filePath}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
catch (Exception ex)
{
MessageBox.Show($"加载视频失败:\n{ex.Message}\n\n文件路径{filePath}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void VideoPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
try
{
if (VideoPlayer.NaturalDuration.HasTimeSpan)
{
TotalTimeText.Text = FormatTime(VideoPlayer.NaturalDuration.TimeSpan);
ProgressBar.Maximum = VideoPlayer.NaturalDuration.TimeSpan.TotalSeconds;
}
// 自动开始播放
if (!_isPlaying)
{
VideoPlayer.Play();
_isPlaying = true;
PlayPauseButton.Content = "暂停";
_timer?.Start();
}
}
catch (Exception ex)
{
MessageBox.Show($"媒体打开后处理失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
private void VideoPlayer_MediaEnded(object sender, RoutedEventArgs e)
{
_isPlaying = false;
PlayPauseButton.Content = "播放";
VideoPlayer.Position = TimeSpan.Zero;
_timer.Stop();
}
private void PlayPauseButton_Click(object sender, RoutedEventArgs e)
{
if (_isPlaying)
{
VideoPlayer.Pause();
_isPlaying = false;
PlayPauseButton.Content = "播放";
}
else
{
VideoPlayer.Play();
_isPlaying = true;
PlayPauseButton.Content = "暂停";
_timer.Start();
}
}
private void StopButton_Click(object sender, RoutedEventArgs e)
{
VideoPlayer.Stop();
_isPlaying = false;
PlayPauseButton.Content = "播放";
_timer.Stop();
CurrentTimeText.Text = "00:00";
ProgressBar.Value = 0;
}
private void OpenFileButton_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog
{
Filter = "视频文件|*.mp4;*.avi;*.mkv;*.mov;*.wmv|所有文件|*.*",
Title = "选择视频文件"
};
if (openFileDialog.ShowDialog() == true)
{
LoadVideo(openFileDialog.FileName);
}
}
private void Timer_Tick(object sender, EventArgs e)
{
if (VideoPlayer.NaturalDuration.HasTimeSpan)
{
var currentTime = VideoPlayer.Position;
CurrentTimeText.Text = FormatTime(currentTime);
ProgressBar.Value = currentTime.TotalSeconds;
}
}
private string FormatTime(TimeSpan timeSpan)
{
return $"{(int)timeSpan.TotalMinutes:D2}:{timeSpan.Seconds:D2}";
}
protected override void OnClosed(EventArgs e)
{
_timer?.Stop();
VideoPlayer?.Close();
base.OnClosed(e);
}
}
}