C# wpf 使用ffplay实现视频播放器

59 篇文章 29 订阅

ffplay自定义系列

第一章 自定义播放器接口
第二章 倍速播放
第三章 dxva2硬解渲染
第四章 提供C#接口
第五章 制作wpf播放器(本章)



前言

有了《WPF视频渲染系列》的视频渲染方法,再结合笔者已有的一个定制化ffplay播放器《基于ffplay改造成自定义多开播放器》,我们可以很容易的在wpf中实现一个播放器软件,这个播放器可以支持本地播放、摄像头播放、网络点播、rtmp和rtsp拉流。


一、播放模块

参考第四章 提供C#接口


二、界面

由于使用wpf制作界面所以很多酷炫的效果都可以做,界面可以做的比较好看。

1、关键实现

(1)、圆角边框

圆角边框需要设置窗口透明,如果使用AllowsTransparency=“True”,会严重影响性能,可能导致渲染视频卡顿。我使用的是WindowChrome.WindowChrome实现圆角边框。具体代码就不贴出了,网上可以找到解决方案。
还有一个关键点是不能使用窗口阴影,会影响d3dImage渲染性能。

(2)、拖动移动调整大小

由于使用了WindowChrome.WindowChrome实现无边框圆角窗口,所有移动和调整大小功能基本要自己实现了。参考《C# wpf 附加属性实现任意控件(包括窗口)拖动》《C# wpf 附加属性实现任意控件拖动调整大小》

(3)、播放

由于在界面上渲染视频,且播放中再次Start内部会先调用Stop,Stop是同步实现的,在渲染或停止事件有Invoke时停止容易造成死锁,所以需要判断播放中时异步Stop后再Start。

 async void StartPlay(string url)
 {   
     if (_isStarted)
     {
         await Task.Run(() =>
         {
             _play.Stop();
         });
         _play.Start(url);
         _isStarted = true;    
     }
     else
     {
         _play.Start(url);
         _isStarted = true;    
     }
 }

(4)、停止

与上面相同,停止的时候需要异步停止。

private async void Stop_Button_Click(object sender, RoutedEventArgs e)
{
    await Task.Run(() =>
  {
      _play.Stop();
  });
  _isStarted = false;  
}

(4)、进度条

参考《C# wpf slider实现显示进度、拖动定位、点击定位功能》

(5)、关闭播放

关闭窗口时,使用同步接口停止播放器会导致死锁:主线程等待渲染线程结束,同时渲染线程等待主线程invoke。所以我们需要异步停止来防止死锁。

示例代码如下:

private async void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    if (_play == null)
        return;
    e.Cancel = true;
    //异步退出,防止死锁
    await Task.Run(() =>
    {
        _play.Dispose();
    });
    _play = null;
    Close();
}

2、效果预览

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


三、下载

https://download.csdn.net/download/u013113678/85437645
vs2019 .net6.0项目

注:资源只包含C#源码,C语言播放器模块只提供x86dll,请根据需要下载。C#源码包含了《WPF视频渲染系列》的所有内容,切勿重复下载。


总结

实现一个视频播放器基于ffplay,功能是很强大的同时也具有足够的稳定性,但是其内部实现代码庞杂,改造起来还是不太容易的,而且其功能也不是绝对完善的很多地方需要拓展和优化,比如精准定位、倍速播放、硬解渲染。有一个定制化的底层播放器后,利用wpf的界面优势很容易的就做出一个可以日常使用的播放器。当前版本的播放器功能相对简单,还不足以当成日常使用,还缺少平滑拖动定位、音轨选择、字幕播放以及声音放大等功能。

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
WPF(Windows Presentation Foundation)是一个用于构建应用程序的框架,可用于创建图形化用户界面 (GUI)。WriteableBitmap是WPF中的一个类,用于在内存中创建可编辑的位图。结合这两者,可以实现一个简单的视频播放器。 首先,需要导入WPF相关的命名空间,并创建一个MainWindow窗口。在窗口中,我们可以使用MediaElement控件来播放视频文件。MediaElement控件是WPF中的一个多媒体播放器。 然后,我们可以使用WriteableBitmap创建一个可编辑的位图实例,用于显示视频的帧。可以在XAML中创建一个Image控件,并将WriteableBitmap设置为其Source属性。 接下来,我们需要通过MediaElement控件的MediaOpened事件来获取视频的宽度和高度。一旦获取到这些值,我们可以创建一个与视频帧大小相同的WriteableBitmap,并使用响应的宽度和高度。 然后,可以通过MediaElement控件的MediaEnded事件来获取视频的帧并将其存储为WriteableBitmap。可以使用WriteableBitmap的Render方法,将视频的帧作为WriteableBitmap的可视化视图。 最后,可以通过在主窗口中的Image控件的Source属性中设置WriteableBitmap,来显示视频的帧。可以使用DispatcherTimer控件来定期更新帧,以实现动态的视频播放。 需要注意的是,这只是一个基本的框架,用于实现一个使用WriteableBitmap的简单视频播放器。实际开发中还需要考虑更多的细节,如视频编解码以及帧的处理和渲染等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeOfCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值