C# 视频播放器 采用迅雷Aplayer 绿色使用无需安装 支持VS2022

news/2024/9/18 6:25:17/

引擎介绍

APlayer 媒体播放引擎是迅雷公司从 2009 年开始开发的通用音视频媒体文件播放内核。

迅雷看看播放器和迅雷影音就是使用 APlayer 作为播放内核。

本质上APlayer播放引擎是一个ActiveX控件,可以被本地其他外部程序嵌入调用,也可以直接被网页嵌入,类似于(Adobe Flash Player)。APlayer不包含界面,但另一个依赖于APlayer的ActiveX控件APlayerUI可以提供丰富的界面元素(播放控制条,Flash广告等),APlayerUI 也被包含在 APlayerSDK 中。

官方地址:迅雷APlayer媒体播放引擎-首页

重点

本文章与目前网上的均不一致,请注意查看,完全可以做到绿色版。

本次开发使用的是APlayerCaller.dll插件  由原来的COM的方式改为用插件的方式。完美支持VS2022以上版本。

上部分代码

1.引入DLL

//创建视频窗口[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_Create", SetLastError = true)]public static extern int APlayer_Create(int hParent,int x,int y,int nWidth,int nHeight,IntPtr OnMessage,IntPtr OnStateChanged,IntPtr OnOpenSuccess,IntPtr OnSeekCompleted,IntPtr OnBuffer,IntPtr OnVideoSizeChanged,IntPtr ondownloadcodec,IntPtr OnEvent);//打开 指定 地址的视频[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_OpenW", CharSet = CharSet.Auto, SetLastError = true)]public static extern bool APlayer_OpenW(int hand, string url);//开始播放[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_Play", SetLastError = true)]public static extern bool APlayer_Play(int hand);//设置Logo[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_SetCustomLogo", SetLastError = true)]public static extern bool APlayer_SetCustomLogo(int hand, int logo);//设置参数[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_SetConfigA", SetLastError = true)]public static extern int APlayer_SetConfigA(int hand, int configid, string val);//获取版本号[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_GetVersion", SetLastError = true)]public static extern string APlayer_GetVersion(int hand);//获取视频宽度[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_GetVideoWidth", SetLastError = true)]public static extern int APlayer_GetVideoWidth(int hand);//获取视频高度[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_GetVideoHeight", SetLastError = true)]public static extern int APlayer_GetVideoHeight(int hand);//销毁[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_Destroy", SetLastError = true)]public static extern bool APlayer_Destroy(int hand);//关闭[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_Close", SetLastError = true)]public static extern bool APlayer_Close(int hand);//暂停[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_Pause", SetLastError = true)]public static extern bool APlayer_Pause(int hand);//获取播放器的当前状态,返回整数型状态代码。0:准备就绪,1:正在打开,2:正在暂停,3:暂停中,4:正在开始播放,5:播放中,6:正在开始关闭。[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_GetState", SetLastError = true)]public static extern int APlayer_GetState(int hand);//获取时长[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_GetDuration", SetLastError = true)]public static extern int APlayer_GetDuration(int hand);//获取当前位置[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_GetPosition", SetLastError = true)]public static extern int APlayer_GetPosition(int hand);//设置当前位置[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_SetPosition", SetLastError = true)]public static extern int APlayer_SetPosition(int hand, int position);//获取声音大小[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_GetVolume", SetLastError = true)]public static extern int APlayer_GetVolume(int hand);//设置当前的播放音量,取值范围为 0 - 1000,100时就是正常的满音量,取值1000为十倍音量。[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_SetVolume", SetLastError = true)]public static extern int APlayer_SetVolume(int hand, int volume);//判断是否处于设置播放进度过程中。当调用[设置当前播放位置]后,播放器执行设置操作,这个过程需要花费一定的时间,所以提供了这个方法来供调用者查询当前是否处于设置过程中。0:不在设置过程中,1:在设置过程中。[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_IsSeeking", SetLastError = true)]public static extern int APlayer_IsSeeking(int hand);//用于获取APlayer播放器在播放网络文件时的数据缓冲进度。-1:不在缓冲过程中,0-99:缓冲进度。[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_GetBufferProgress", SetLastError = true)]public static extern int APlayer_GetBufferProgress(int hand);//获取设置[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_GetConfigA", SetLastError = true)]public static extern int APlayer_GetConfigA(int hand, int configid);//获取窗口句柄[DllImportAttribute("APlayerCaller.dll", EntryPoint = "APlayer_GetWindow", SetLastError = true)]public static extern int APlayer_GetWindow(int hand);//载入一个位图、图标或指针 执行成功则返回对象的一个句柄;零表示失败[DllImportAttribute("APlayerCaller.dll", EntryPoint = "LoadImage", SetLastError = true)]public static extern int LoadImage(int hand, //要从其中载入图象的DLL或应用程序模块或实例句柄。零表示装载一幅固有图象string flag, //欲载入图象的名字。如指定了hInst,就用这个参数指定资源或资源的标志符(标志符是一个长整数)。如hInst为空,而且已指定了LR_LOADFROMFILE,那么这个参数代表文件名(位图、图标或指针文件)。如果是个Long型值,这个参数就代表固有位图、图标或指针的编号int type, //下述常数之一,指定了欲载入的图象类型:IMAGE_BITMAP, IMAGE_CURSOR, IMAGE_ICONint width, // 要求的图象宽度和高度。图象会根据情况自动伸缩。如设为零,表示用图象的默认大小int height, //同上int zh //下述常数的任意组合,它们都在api32.txt文件中得到了定义:;LR_DEFAULTCOLOR:以常规方式载入图象;LR_LOADREALSIZE:不对图象进行缩放处理。忽略n1和n2的设置;LR_CREATEDIBSECTION:如果指定了IMAGE_BITMAP,就返回DIBSection的句柄,而不是位图的句柄;LR_DEFAULTSIZE:如果n1和n2为零,就使用由系统定义的图象默认大小,而不是图象本身定义的大小;LR_LOADFROMFILE:如hInst为零,lpsz就代表要载入适当类型的一个文件的名字,仅适用于Win95;LR_LOADMAP3DCOLORS:将图象中的深灰、灰、以及浅灰像素都替换成COLOR_3DSHADOW,COLOR_3DFACE以及COLOR_3DLIGHT的当前设置;LR_LOADTRANSPARENT:与图象中第一个像素相符的所有像素都由系统替换;LR_MONOCHROME:将图象转换成单色;LR_SHARED:将图象作为一个共享资源载入。在NT 4.0中装载固有资源时要用到这个设置;);

2.初始化

private bool initVideo(){IntPtr POnMessage = Marshal.GetFunctionPointerForDelegate(new fun3(OnMessage));IntPtr POnStateChanged = Marshal.GetFunctionPointerForDelegate(new fun2(OnStateChanged));IntPtr POnOpenSuccess = Marshal.GetFunctionPointerForDelegate(new fun0(OnOpenSucceeded));IntPtr POnSeekCompleted = Marshal.GetFunctionPointerForDelegate(new fun1(OnSeekCompleted));IntPtr POnBuffer = Marshal.GetFunctionPointerForDelegate(new fun1(OnBuffer));IntPtr POnVideoSizeChanged = Marshal.GetFunctionPointerForDelegate(new fun0(OnVideoSizeChanged));IntPtr POnDownloadCodec = Marshal.GetFunctionPointerForDelegate(new funstr(OnDownloadCodec));IntPtr POnEvent = Marshal.GetFunctionPointerForDelegate(new fun2(OnEvent));if (HAplayer == 0){//创建代码HAplayer = APlayer_Create(panel1.Handle.ToInt32(), 0, 0, panel1.Width, panel1.Height, POnMessage, POnStateChanged, POnOpenSuccess, POnSeekCompleted, POnBuffer, POnVideoSizeChanged, POnDownloadCodec, POnEvent);//int HAplayer = APlayer_Create(panel1.Handle.ToInt32(), 0, 0, 200, 200, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);//MessageBox.Show("句柄是:" + HAplayer.ToString());//APlayer_SetCustomLogo(HAplayer, -1);if (HAplayer > 0){VolumeTrackBar.Value = APlayer_GetVolume(HAplayer);return true;}}return false;}

3.消息回调

void OnMessage(int l1, int l2, int l3){//方法体Debug.WriteLine(l1 + "=OnMessage=" + l2);}void OnStateChanged(int l1, int l2){Debug.WriteLine(l1 + "=OnStateChanged=" + l2);if (l2 == 6){PlayButton.Text = "播放";}}void OnOpenSucceeded(){Debug.WriteLine("=OnOpenSucceeded=");}void OnSeekCompleted(int l1){Debug.WriteLine(l1 + "=OnSeekCompleted=");}void OnBuffer(int l1){Debug.WriteLine(l1 + "=OnBuffer=");}void OnVideoSizeChanged(){Debug.WriteLine("=OnVideoSizeChanged=");}void OnEvent(int nEventCode, int nEventParam){Debug.WriteLine(nEventCode + "=OnEvent=" + nEventParam);}void OnDownloadCodec(string l1){Debug.WriteLine(l1 + "==OnDownloadCodec");}

效果展示


http://www.ppmy.cn/news/899740.html

相关文章

html播放器投屏,迅雷播放器投屏到电视如何操作

我个人使用感受,小米电视的无线投屏不错,手机电脑都可以投,操作简单,画面流畅,但有网友问迅雷影音能不能做到,迅雷影音是一款非常好用的视频播放软件,它可以进行各种视频的播放,很多小伙伴们可能不知道原来迅雷影音也是能投屏的吧…

迅雷7 down.php,迅雷云点播放器(KCPlayer5000)

KCPlayer基于迅雷云点播,免费享受高速通道,免费使用离线下载,高清云端快速转码,即点即播。。 相似软件 版本说明 软件地址 KCPlayer的先祖是“迅雷云点播放器2.0”,不过作为一款小众软件,因为突然红火&…

如何找到迅雷自带播放器

1,首先找到迅雷图标,然后鼠标右键点击,找到打开文件当前位置 2.找到xmp文件夹,点进去找到program文件夹,最后找到xmp.exe.它就是播放器,你可以把它放到桌面.

@EnableConfigurationProperties失效了 不能将配置类导入容器

以前,我定义属性值都是在application开头的配置文件的,有一天自定义了一个配置文件名为ldj.properties.结合注解 PropertySource 指定加载读取它,然后EnableConfigurationProperties测试发现,使用的都是默认值,没有读取配置的值. package com.dj.springtest.config.properties…

Hadoop 3.2.4 本机伪分布式安装

Hadoop 3.2.4 伪分布式安装 文章目录 Hadoop 3.2.4 伪分布式安装前言配置ssh免密登录下载安装包解压并调整配置文件解压安装包到当前位置调整配置文件hadoop-env.shyarn-env.shcore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xmlworkers 配置 启动验证启动与命令查验web页…

什么是矢量图

矢量图只能靠软件生成,这种类型的图像文件包含独立的分离图像,可以自由无限制的重新组合,文件中的图形元素称为对象,每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。 矢量图形最大的优…

Photoshop 什么是位图?什么是矢量图?它们二者间有什么区别,不妨来看看

对于PS大家也都已经不陌生了,PS是一款非常强大的通用平面美术设计软件,大家刚学设计的朋友,都会基础位图和矢量图,那它们的区别是什么呢?下面小编就为大家讲解它们之间的分别。 位图与矢量图: 位图&#x…

AutoCAD输出矢量图

软件版本:AutoCAD 2020 输出为PDF文件,注意输出模式,显示窗口应包含要输出的图形。 安装软件Inkscape,打开Inkscape,导入刚才输出的PDF。注意选择导入模式。 更改页面大小,去除图像周围的空白区域。 另存为…

位图与矢量图的区别

相信大家在日常的工作过程中,经常会听到位图和矢量图,那么位图和矢量图的区别是什么呢? 1.定义 ①位图:称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的。这 些点可以进行不同…

androidstudio加载矢量图

VectorDrawable 是android SDK 21及以上版本才支持的方式,在它及它以上的版本中SDK可以支持矢量图。由于国内手机大多还是4.0的系统,因此在低版本的手机中无法使用矢量图。 在android studio的gradle plugin 更新到1.4版本的时候,googole通过…

graphpad图片怎么导出矢量图_怎样将PS图像输出为矢量图

展开全部 1、打开Photoshop软件,将需做矢量图的logo添加进来,并复e68a8462616964757a686964616f31333431353966制图层。 2、观察图形,我们先从外侧圆入手,外侧圆比较规整,用“快速选择”等方法的话效果不好&#xff0c…

如何在word里插入矢量图

在写论文时往往需要插入很多图,插入的图如果不是矢量图就会挨老板一遍又一遍批。现在来记录一下怎么让论文里的图片保持清晰度(放大缩小图片都不会失真,一句话,不会变模糊) 一、插入对象如visio对象 1. 找到 插入-&g…

R 语言储存矢量图

之前写的博客中有提及过如何在 R 语言中绘制矢量图,然后用于论文引用。但没有专门开一篇博客来进行说明比较,这里重新开一篇博客来进行说明。 通常保存为矢量图可能大多数时候是为了论文中的引用,所以格式一般为 EPS, PDF 这两种格式&#x…

android开发笔记之xml矢量图片

xml矢量图片 缩放矢量图形(英语:Scalable Vector Graphics,SVG)是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。 .svg格式相对于.jpg、.png甚至.webp具有较多优势&#xff1a…

html 引入 svg矢量图,前端可视化——SVG矢量图技术

SVG 1、SVG 是一种绘图技术,SVG 的全名叫可缩放矢量图形(Scalable Vector Graphics)。 2、SVG 使用 XML 格式定义图像。 3、可伸缩,不失真。 简单示例: stroke-width="2" fill="red" /> 复制代码 1、SVG的结构 他是标准的 XML 文档结构。 /p> &qu…

MATLAB导出矢量图

写论文的时候经常要用到矢量图,会用matlab的仿真图,借鉴以下两篇博文就行了。CSDN水文太多了,需要边找边验证… matlab波形图导出转换成矢量图 MATLAB导出矢量图结合Visio或Adobe illustrator处理图片

java 生成ai矢量图,PS和AI将图片转成矢量图

位图和矢量图 PS软件做的图都是位图,可以导出AI格式,但是不可能做成矢量图的。放大后会有马塞克,可以把分辨率调高一点,做出来的位图会清晰一些,但放大或缩小后,图片还是为失真,表现为像素点。 …

Word中插入MATLAB矢量图

Word中插入MATLAB矢量图 之前本科期间写毕设论文时并没有注意到图片的格式问题,老师也并没有要求,所以我用matlab 作出的所有图片都是使用.jpg格式保存的。最近看师兄的论文才发现图片是能够以矢量图的形式插入 Word 中并输出高质量 pdf 文档的。 具体…

论文绘图——矢量图篇

科技论文写作过程经常有需要使用流程图,系统框架图,以及软件工程中常用的用例图,类图等等。这些图不由具体代码运行得到,而是作者根据需求自己绘制,我觉得这类图应该绘制为矢量图。矢量图是根据几何特性来绘制图形&…

matlab:输出矢量图的简便方法

目录 1. figure窗口的快捷工具(不完美但是快) 2. figure窗口另存为选项(最佳) 3. figure窗口中的复制选项(不怎么样) 1. figure窗口的快捷工具(不完美但是快) 可以利用快捷工具中…