c#万能视频播放器(附代码)

c#万能视频播放器

  本人之前很多的文章中均提到了使用libvlc为播放器内核制作的播放器,也许有些朋友对此感兴趣,于是我用c#写了一个调用libvlc api实现的万能视频播放器,与大家分享一下。说它“万能”,当然是因为我们站在了vlc的肩膀上。

  vlc是一个强大而且开源的多媒体播放器,也可以说是一个多媒体平台。它支持非常广泛的媒体格式的本地播放,完全可以媲美mplayer,其对视频网络流的处理能力更是非常强悍。libvlc就是指的vlc的核心,它向外提供了一系列的接口,通过接口,来实现视频播放等复杂的功能。libvlc对外提供了c语言的接口,也有其他语言,包括.net的绑定,在其官网上就有,不过已经“年久失修”。我之前用Qt, MFC实现过基于libvlc的播放器,不过鉴于园子里c#开发人员较多,遂用c#封装了一下libvlc的API接口,并实现了一个视频播放器。

  先上鉴赏图,外表很简单,不过,外表不是重点:)

  

  首先是libvlc的一些导出函数,我在注释里对它们的功能都有说明

 1         // 创建一个libvlc实例,它是引用计数的 2         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
 3         [SuppressUnmanagedCodeSecurity]
 4         private static extern IntPtr libvlc_new(int argc, IntPtr argv);
 5
 6         // 释放libvlc实例 7         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
 8         [SuppressUnmanagedCodeSecurity]
 9         public static extern void libvlc_release(IntPtr libvlc_instance);
10
11         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
12         [SuppressUnmanagedCodeSecurity]
13         public static extern String libvlc_get_version();
14
15         // 从视频来源(例如Url)构建一个libvlc_meida16         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
17         [SuppressUnmanagedCodeSecurity]
18         private static extern IntPtr libvlc_media_new_location(IntPtr libvlc_instance, IntPtr path);
19
20         // 从本地文件路径构建一个libvlc_media21         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
22         [SuppressUnmanagedCodeSecurity]
23         private static extern IntPtr libvlc_media_new_path(IntPtr libvlc_instance, IntPtr path);
24
25         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
26         [SuppressUnmanagedCodeSecurity]
27         public static extern void libvlc_media_release(IntPtr libvlc_media_inst);
28
29         // 创建libvlc_media_player(播放核心)30         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
31         [SuppressUnmanagedCodeSecurity]
32         public static extern IntPtr libvlc_media_player_new(IntPtr libvlc_instance);
33
34         // 将视频(libvlc_media)绑定到播放器上35         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
36         [SuppressUnmanagedCodeSecurity]
37         public static extern void libvlc_media_player_set_media(IntPtr libvlc_media_player, IntPtr libvlc_media);
38
39         // 设置图像输出的窗口40         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
41         [SuppressUnmanagedCodeSecurity]
42         public static extern void libvlc_media_player_set_hwnd(IntPtr libvlc_mediaplayer, Int32 drawable);
43
44         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
45         [SuppressUnmanagedCodeSecurity]
46         public static extern void libvlc_media_player_play(IntPtr libvlc_mediaplayer);
47
48         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
49         [SuppressUnmanagedCodeSecurity]
50         public static extern void libvlc_media_player_pause(IntPtr libvlc_mediaplayer);
51
52         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
53         [SuppressUnmanagedCodeSecurity]
54         public static extern void libvlc_media_player_stop(IntPtr libvlc_mediaplayer);
55
56         // 解析视频资源的媒体信息(如时长等)57         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
58         [SuppressUnmanagedCodeSecurity]
59         public static extern void libvlc_media_parse(IntPtr libvlc_media);
60
61         // 返回视频的时长(必须先调用libvlc_media_parse之后,该函数才会生效)62         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
63         [SuppressUnmanagedCodeSecurity]
64         public static extern Int64 libvlc_media_get_duration(IntPtr libvlc_media);
65
66         // 当前播放的时间67         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
68         [SuppressUnmanagedCodeSecurity]
69         public static extern Int64 libvlc_media_player_get_time(IntPtr libvlc_mediaplayer);
70
71         // 设置播放位置(拖动)72         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
73         [SuppressUnmanagedCodeSecurity]
74         public static extern void libvlc_media_player_set_time(IntPtr libvlc_mediaplayer, Int64 time);
75
76         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
77         [SuppressUnmanagedCodeSecurity]
78         public static extern void libvlc_media_player_release(IntPtr libvlc_mediaplayer);
79
80         // 获取和设置音量81         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
82         [SuppressUnmanagedCodeSecurity]
83         public static extern int libvlc_audio_get_volume(IntPtr libvlc_media_player);
84
85         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
86         [SuppressUnmanagedCodeSecurity]
87         public static extern void libvlc_audio_set_volume(IntPtr libvlc_media_player, int volume);
88
89         // 设置全屏90         [DllImport("libvlc", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
91         [SuppressUnmanagedCodeSecurity]
92         public static extern void libvlc_set_fullscreen(IntPtr libvlc_media_player, int isFullScreen);

  

  要使用libvlc api进行播放,首先需要创建一个libvlc的实例,就是lbvlc_instance,之后所有的操作都是基于这个实例来完成。

  每一个播放窗口,对应一个libvlc_media_player,而每一个媒体文件,就是一个libvlc_media。所以,调用的步骤就是:

  1. 创建libvlc_instance
  2. 创建libvlc_media_player
  3. 开始播放时,创建libvlc_media,通知libvlc_media_player要播放的媒体文件,之后就可以释放libvlc_media了
  4. 操作libvlc_media_player,实现播放、暂停等功能

  下面对这些操作进行封装,以供上层使用。

class VlcPlayer{private IntPtr libvlc_instance_;private IntPtr libvlc_media_player_;private double duration_;public VlcPlayer(string pluginPath){string plugin_arg = "--plugin-path=" + pluginPath;string[] arguments = { "-I", "dummy", "--ignore-config", "--no-video-title", plugin_arg };libvlc_instance_ = LibVlcAPI.libvlc_new(arguments);libvlc_media_player_ = LibVlcAPI.libvlc_media_player_new(libvlc_instance_);}public void SetRenderWindow(int wndHandle){if (libvlc_instance_ != IntPtr.Zero && wndHandle != 0){LibVlcAPI.libvlc_media_player_set_hwnd(libvlc_media_player_, wndHandle);}}public void PlayFile(string filePath){IntPtr libvlc_media = LibVlcAPI.libvlc_media_new_path(libvlc_instance_, filePath);if (libvlc_media != IntPtr.Zero){LibVlcAPI.libvlc_media_parse(libvlc_media);duration_ = LibVlcAPI.libvlc_media_get_duration(libvlc_media) / 1000.0;LibVlcAPI.libvlc_media_player_set_media(libvlc_media_player_, libvlc_media);LibVlcAPI.libvlc_media_release(libvlc_media);LibVlcAPI.libvlc_media_player_play(libvlc_media_player_);}}public void Pause(){if (libvlc_media_player_ != IntPtr.Zero){LibVlcAPI.libvlc_media_player_pause(libvlc_media_player_);}}public void Stop(){if (libvlc_media_player_ != IntPtr.Zero){LibVlcAPI.libvlc_media_player_stop(libvlc_media_player_);}}public double GetPlayTime(){return LibVlcAPI.libvlc_media_player_get_time(libvlc_media_player_) / 1000.0;}public void SetPlayTime(double seekTime){LibVlcAPI.libvlc_media_player_set_time(libvlc_media_player_, (Int64)(seekTime * 1000));}public int GetVolume(){return LibVlcAPI.libvlc_audio_get_volume(libvlc_media_player_);}public void SetVolume(int volume){LibVlcAPI.libvlc_audio_set_volume(libvlc_media_player_, volume);}public void SetFullScreen(bool istrue){LibVlcAPI.libvlc_set_fullscreen(libvlc_media_player_, istrue ? 1 : 0);}public double Duration(){return duration_;}public string Version(){return LibVlcAPI.libvlc_get_version();}}

  封装为VlcPlayer之后,调用就会变得非常简单。

  • 首先确定好vlc的插件目录
  • 在你的代码里创建VlcPlayer对象
  • 调用SetRenderWindow,以设置视频显示的窗口,否则会变成一个独立的播放窗口
  • 调用PlayFile,即可开始播放

  程序做好之后,需要带上libvlc.dlllibvlccore.dll,这两个是vlc的播放内核,因为vlc把编解码和格式解析的支持设计成了插件的形式,所以还必须要带上vlc的plugins目录里的插件。

  我把整个工程打包(包括libvlc.dlllibvlccore.dll)上传到了博客上,点击这里,就可以下载。

  plugins目录文件有点大(因为libvlc支持的格式和功能非常多,如果你不需要,删掉对应插件即可),我放到了115网盘,下载地址是http://115.com/file/dnre4jg7#plugins.7z。下载后放到“bin/Debug”目录即可调试运行。

+++++++++++++++++++++++++++++++++++++++++++++++++++++

HaibinDev软件工作室。(版权所有,转载请注明作者和出处~)

+++++++++++++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/08shiyan/archive/2013/05/22/3092627.html

c#万能视频播放器 (转)相关推荐

  1. android能播放4k视频格式,安卓APP,无广告支持多种格式的万能视频播放器

    原标题:安卓APP,无广告支持多种格式的万能视频播放器 万能视频播放器 万能视频播放器是一款专业的视频播放工具.它支持所有视频格式,支持 4K/超高清视频文件,并且能够高清播放.它是安卓手机和平板上欣 ...

  2. IINA 1.1.0beta1中文版 - Mac最强万能视频播放器

    IINA 1.1.0beta1中文版是一款免费开源的 macOS 万能视频播放器,基于 mpv (一款命令行启动/高度自定义配置的高性能跨平台开源播放器) 而来,使用 Swift 语言开发,拥有强大的 ...

  3. 万能视频播放器:恒星播放器 for Mac(1.500中文免费)

    恒星播放器 mac中文版是mac上一款超级好用的万能视频播放器,可以迅速播放各种格式的视频和音频,而且不损失播放质量,为您提供流畅舒适的高清视频播放体验,欢迎需要的朋友安装体验! 原文链接:https ...

  4. 恒星播放器 1.101中文版(万能视频播放器)

    恒星播放器 mac中文版是mac上一款超级好用的万能视频播放器,可以迅速播放各种格式的视频和音频,而且不损失播放质量,为您提供流畅舒适的高清视频播放体验! 支持所有格式视频播放 播放所有格式视频文件 ...

  5. IINA for Mac(万能视频播放器)中文版

    mac视频播放器哪个好用?这里推荐IINA for Mac,这款iina播放器支持多种格式的视频文件,哪怕是播放4K这些高分辨率视频都很流畅,看着简洁,但是功能很全面,重点是这款iina播放视频器的英 ...

  6. 轻播zFuse Pro for Mac(万能视频播放器)

    轻播zFuse mac中文版是一款简单强大好用的万能视频播放器,拥有简洁.轻快.好用的特点,支持同时播放多个视频文件,也可以对视频进行旋转或者对硬件进行加速操作,支持与外部的字幕文件配合使用,是您在苹 ...

  7. android万能播放器,Android万能视频播放器05-音视频同步

    1.概念 由于视频播放器中音频和视频是分别播放和渲染的,就会出现声音和画面不同步的现象.为了使同一时刻声音和画面的一致性,我们就需要音视频同步来实现,这就是音视频同步. 2.播放时间 2.1.音频播放 ...

  8. Elmedia Player Pro for Mac(万能视频播放器)

    Mac上哪款视频播放器最好用?Elmedia Player Pro mac版集成了在线视频下载和视频播放的功能!能够通过软件内置的浏览器直接下载在线视频,包括优酷.土豆.Youtube等视频网站,还支 ...

  9. android 万能视频播放器

    android 自带的mediaplayer出于一些专利等等滴原因,只能支持mp4格式视频的播放,对于一款能够满足用户需求的视频播放器应用肯定是远远不够的,那么我们需要采取一些手段了,废话不多说了. ...

最新文章

  1. 聊一聊javascript执行上下文
  2. 语义分割--FCN 算法中的一些细节--特征怎么融合
  3. Plant Simulation常用命令
  4. 从单体应用到微服务架构演化
  5. 仿微信公众平台“打标签”功能~~~
  6. *Codeforces587E. Duff as a Queen
  7. 如何理解遗传算法中的编码与解码?以二进制编码为例
  8. Windows Server入门系列之十 注册表的基本使用
  9. 【LeetCode】剑指 Offer 47. 礼物的最大价值
  10. C++socket编程(三):3.9 TCPServer移植到windows中
  11. mysql deadlock 记录_MySQL DeadLock故障排查全过程记录
  12. 使用Visual Studio 2010 Team System中的架构师工具(设计与建模)
  13. leetcode【链表—中等】707.设计链表
  14. 翻译 Learning Unsupervised Video Object Segmentation through Visual Attention
  15. 淘宝/天猫获取商品历史价格信息 API 返回值说明
  16. html为知笔记模板,为知笔记如何建立模板教程
  17. Java 16进制求和
  18. 云南昆明主城区一在建工地围墙倒塌致2人死亡
  19. Mac上播放 swf 格式文件 小技巧
  20. Navicat Premium连接远程数据库

热门文章

  1. 用完U盘忘记安全退出了,会造成数据丢失吗
  2. 结对-五子棋游戏-开发过程
  3. 智能&大数据时代,架构师思维的十个学习步骤(优化版)
  4. [转]让你提升命令行效率的 Bash 快捷键
  5. 程序员面试题100题第19题——反转链表
  6. 根据之前发的那SQL语句查询表结构的语句做了个MSSQL实体类生成器!
  7. [原]动态创建Web控件制做计算器
  8. POJ1064(二分搜索)解题报告
  9. 数据库内核月报 - 2015 / 11-MySQL · 社区见闻 · OOW 2015 总结 MySQL 篇
  10. MySQL双机热备部署