WPF媒体播放器(MediaElement)打开指定的视频、播放、暂停、快进、快退、截图

XAML

<Window x:Class="MediaSampleWPF.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WPF100" Height="413" Width="632">
    <Window.Resources>
        <Style x:Key="btnStyle" TargetType="Button">
            <Setter Property="Background">
                <Setter.Value>
                    <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                        <GradientStop Offset="0" Color="White"/>
                        <GradientStop Offset="0.5" Color="#FF554D4A"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="Margin" Value="5"/>
            <Setter Property="Width" Value="60"/>
            <Setter Property="Foreground" Value="YellowGreen"/>
            <Style.Triggers>
                <Trigger Property="Button.IsMouseOver" Value="True">
                    <Setter Property="Foreground" Value="Black"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid x:Name="LayoutRoot" Background="Black">
        <Grid.RowDefinitions>
            <RowDefinition Height="322*" />
            <RowDefinition Height="53*" />
        </Grid.RowDefinitions>
        <MediaElement x:Name="MediaEL" MediaOpened="MediaEL_MediaOpened" MediaEnded="MediaEL_MediaEnded"
                      LoadedBehavior="Manual" Margin="0,10"/>
        <StackPanel Orientation="Vertical" Margin="120,0" Grid.Row="1">
            <StackPanel x:Name="SPSeekBar" HorizontalAlignment="Stretch">
                <Slider x:Name="seekBar" Thumb.DragStarted="seekBar_DragStarted"
                        Thumb.DragCompleted="seekBar_DragCompleted" />
            </StackPanel>
            <Rectangle Height="5"/>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                <Button x:Name="btnPlay" Content="播放" Click="btnPlay_Click" Style="{StaticResource btnStyle}"
                    Width="50" Height="25" Margin="5,0"/>
                <Button x:Name="btnStop" Content="停止" Click="btnStop_Click"  Style="{StaticResource btnStyle}"
                    Width="50" Height="25" Margin="5,0"/>
                <Button x:Name="btnMoveBackward" Content="后退" Click="btnMoveBackward_Click"  Style="{StaticResource btnStyle}"
                    Width="50" Height="25" Margin="5,0"/>
                <Button x:Name="btnMoveForward" Content="前进" Click="btnMoveForward_Click"  Style="{StaticResource btnStyle}"
                    Width="50" Height="25" Margin="5,0"/>
                <Button x:Name="btnOpen" Content="打开" Click="btnOpen_Click"  Style="{StaticResource btnStyle}"
                    Width="50" Height="25" Margin="5,0"/>
                <Button x:Name="btnScreenShot" Content="截屏" Click="btnScreenShot_Click" Width="50" Height="25" Margin="5,0" Style="{StaticResource btnStyle}" />
            </StackPanel>
        </StackPanel>
    </Grid>
</Window>

CS

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Threading;
using System.Windows.Controls.Primitives;

namespace MediaSampleWPF
{
    public partial class Window1 : Window
    {
        DispatcherTimer timer;

        #region Constructor
        public Window1()
        {
            InitializeComponent();
            IsPlaying(false);
            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(10);
            timer.Tick += new EventHandler(timer_Tick);
        }
        #endregion

        #region IsPlaying(bool)
        private void IsPlaying(bool bValue)
        {
            btnStop.IsEnabled = bValue;
            btnMoveBackward.IsEnabled = bValue;
            btnMoveForward.IsEnabled = bValue;
            btnPlay.IsEnabled = bValue;
            btnScreenShot.IsEnabled = bValue;
            seekBar.IsEnabled = bValue;
        }
        #endregion

        #region Play and Pause
        private void btnPlay_Click(object sender, RoutedEventArgs e)
        {
            IsPlaying(true);
            if (btnPlay.Content.ToString() == "播放")
            {
                MediaEL.Play();
                btnPlay.Content = "暂停";
            }
            else
            {
                MediaEL.Pause();
                btnPlay.Content = "播放";
            }
        }
        #endregion

        #region Stop
        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            MediaEL.Stop();
            btnPlay.Content = "播放";
            IsPlaying(false);
            btnPlay.IsEnabled = true;
        }
        #endregion

        #region Back and Forward
        private void btnMoveForward_Click(object sender, RoutedEventArgs e)
        {
            MediaEL.Position = MediaEL.Position + TimeSpan.FromSeconds(10);
        }

        private void btnMoveBackward_Click(object sender, RoutedEventArgs e)
        {
            MediaEL.Position = MediaEL.Position - TimeSpan.FromSeconds(10);
        }
        #endregion

        #region Open Media
        private void btnOpen_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
            ofd.Filter = "Video Files (*.wmv)|*.wmv";
            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                MediaEL.Source = new Uri(ofd.FileName);
                btnPlay.IsEnabled = true;
            }
        }
        #endregion

        #region Capture Screenshot
        private void btnScreenShot_Click(object sender, RoutedEventArgs e)
        {
            byte[] screenshot = MediaEL.GetScreenShot(1, 90);
            FileStream fileStream = new FileStream(@"Capture.jpg", FileMode.Create, FileAccess.ReadWrite);
            BinaryWriter binaryWriter = new BinaryWriter(fileStream);
            binaryWriter.Write(screenshot);
            binaryWriter.Close();
        }
        #endregion

        #region Seek Bar
        private void MediaEL_MediaOpened(object sender, RoutedEventArgs e)
        {
            if (MediaEL.NaturalDuration.HasTimeSpan)
            {
                TimeSpan ts = MediaEL.NaturalDuration.TimeSpan;
                seekBar.Maximum = ts.TotalSeconds;
                seekBar.SmallChange = 1;
                seekBar.LargeChange = Math.Min(10, ts.Seconds / 10);
            }
            timer.Start();
        }

        bool isDragging = false;

        void timer_Tick(object sender, EventArgs e)
        {
            if (!isDragging)
            {
                seekBar.Value = MediaEL.Position.TotalSeconds;
            }
        }

        private void seekBar_DragStarted(object sender, DragStartedEventArgs e)
        {
            isDragging = true;
        }

        private void seekBar_DragCompleted(object sender, DragCompletedEventArgs e)
        {
            isDragging = false;
            MediaEL.Position = TimeSpan.FromSeconds(seekBar.Value);
        }
        #endregion

        #region MediaEnd
        private void MediaEL_MediaEnded(object sender, RoutedEventArgs e)
        {
            MediaEL.Stop();
            btnPlay.Content = "播放";
        }
        #endregion
    }

    #region Extension Methods
    public static class ScreenShot
    {
        public static byte[] GetScreenShot(this UIElement source, double scale, int quality)
        {
            double actualHeight = source.RenderSize.Height;
            double actualWidth = source.RenderSize.Width;
            double renderHeight = actualHeight * scale;
            double renderWidth = actualWidth * scale;

            RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderWidth,
                (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
            VisualBrush sourceBrush = new VisualBrush(source);

            DrawingVisual drawingVisual = new DrawingVisual();
            DrawingContext drawingContext = drawingVisual.RenderOpen();

            using (drawingContext)
            {
                drawingContext.PushTransform(new ScaleTransform(scale, scale));
                drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0),
                    new Point(actualWidth, actualHeight)));
            }
            renderTarget.Render(drawingVisual);

            JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
            jpgEncoder.QualityLevel = quality;
            jpgEncoder.Frames.Add(BitmapFrame.Create(renderTarget));

            Byte[] imageArray;

            using (MemoryStream outputStream = new MemoryStream())
            {
                jpgEncoder.Save(outputStream);
                imageArray = outputStream.ToArray();
            }
            return imageArray;
        }
    }
    #endregion
}

 

你可以到http://www.wpf100.com/html/5/2012-03/article-167.html下载源码

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF(Windows Presentation Foundation)是一种用于创建 Windows 客户端应用程序的 UI 框架。VLCControl是一个基于VLC Media Player的播放器,可以播放各种音频和视频格式。在WPF中,可以通过调用VLCControl的方法来实现播放器的快进暂停快进是指在音频或者视频播放的过程中将播放的时间向前推进。可以通过调用VLCControl的方法进行快进操作。首先需要使用VLCControl的Play()方法开始播放,然后使用VLCControl的Time属性来获取当前播放时间,最后使用VLCControl的Time跳转方法来快进指定时间。具体的代码实现可参考如下: ``` vlcControl.Play(); vlcControl.Time += TimeSpan.FromSeconds(10); //快进10s ``` 暂停是指暂停当前音频或视频播放。可以通过调用VLCControl的方法实现暂停操作。首先需要检查VLCControl是否在播放状态,如果在,则使用Pause()方法暂停播放;如果不在,则使用Play()方法开始播放。具体的代码实现可参考如下: ``` if (vlcControl.IsPlaying) { vlcControl.Pause(); //暂停播放 } else { vlcControl.Play(); //开始播放 } ``` 总的来说,实现VLCControl播放器的快进暂停操作并不难,只需要调用相应的方法即可。但需要注意的是,具体的实现方式要根据实际需求进行调整,例如需要检查播放器是否处于播放状态等。 ### 回答2: WPF是一种用于构建桌面应用程序的框架。VLCControl是一个基于VLC媒体播放器的控件,可以嵌入到WPF应用程序中。如果想要实现播放快进暂停功能,可以采取以下步骤。 首先,需要使用VLCControl控件创建一个媒体播放器对象。可以在XAML文件中添加以下代码: ```xml <Vlc:VlcControl x:Name="mediaPlayer" /> ``` 然后,在代码中初始化播放器对象并设置媒体路径: ```csharp string mediaPath = "your_media_file_path"; mediaPlayer.MediaPlayer.VlcLibDirectory = new DirectoryInfo(@"C:\Program Files (x86)\VideoLAN\VLC"); mediaPlayer.MediaPlayer.EndInit(); mediaPlayer.MediaPlayer.Play(new Uri(mediaPath)); ``` 接下来,为实现快进暂停功能,需要在代码中添加事件处理器。可以在窗口的Loaded事件中添加以下代码: ```csharp mediaPlayer.MediaPlayer.LengthChanged += new EventHandler<VlcMediaPlayerLengthChangedEventArgs>(mediaPlayer_LengthChanged); mediaPlayer.MediaPlayer.PositionChanged += new EventHandler<VlcMediaPlayerPositionChangedEventArgs>(mediaPlayer_PositionChanged); ``` 然后,实现事件处理器方法: ```csharp private void mediaPlayer_LengthChanged(object sender, VlcMediaPlayerLengthChangedEventArgs e) { // 获取媒体的总长度 totalLength = e.NewLength; } private void mediaPlayer_PositionChanged(object sender, VlcMediaPlayerPositionChangedEventArgs e) { // 实时更新媒体当前的位置 currentPosition = (long)(e.NewPosition * totalLength); } ``` 接下来,即可实现快进暂停功能。可以在代码中添加以下方法: ```csharp private void btnPlay_Click(object sender, RoutedEventArgs e) { // 播放媒体 mediaPlayer.MediaPlayer.Play(); } private void btnPause_Click(object sender, RoutedEventArgs e) { // 暂停媒体 mediaPlayer.MediaPlayer.Pause(); } private void btnFastForward_Click(object sender, RoutedEventArgs e) { // 快进媒体(以1秒为单位) mediaPlayer.MediaPlayer.Time = currentPosition + 1000; } ``` 这样,即可在WPF应用程序中使用VLCControl控件并实现播放快进暂停功能。 ### 回答3: WPF(Windows Presentation Foundation)是Microsoft开发的一款基于Windows操作系统的GUI应用程序框架。在WPF中,可以通过用户自定义控件来实现各种功能,包括媒体播放器。为了实现VLCControl播放器的快进暂停功能,需要先在WPF中引入VLCControl组件。 VLCControl组件是VLC媒体播放器的.NET控件库,可以在WPF中轻松地播放各种媒体文件。要想实现快进暂停功能,可以通过对VLCControl组件的属性和方法进行操作。 对于快进功能,可以使用VLCControl组件的Time属性来获取当前播放时间,然后通过设置该属性来实现快进。例如,如果要快进到当前位置的下一秒,可以设置Time属性为当前时间加1秒。 对于暂停功能,可以通过调用VLCControl组件的Pause方法来实现。该方法会将当前媒体文件暂停播放,并让播放位置停留在当前位置。 最后,为了让用户能够方便地使用这些功能,可以将它们与WPF中的按钮或其他控件绑定,使用户可以通过单击按钮来触发操作。例如,可以使用WPF中的Button控件和CommandBinding来实现这一功能。 总之,通过使用VLCControl组件和WPF中的自定义控件,可以轻松地实现VLC播放器的快进暂停功能。同时,WPF也提供了丰富的UI控件和事件绑定机制,使得实现用户友好的界面交互变得更加容易。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值