C# 调用迅雷aplayer播放器的遇到的问题总结
事件的起因是,目前发布的软件版本中,视频播放使用的是腾讯云点播提供的html版本的播放器(我们的视频存放在腾讯云点播上),客户端采用的是.net framework3.5 开发的,采用WebBrowser内核加载和其它的一个浏览器内核加载后端的页面,通过传参进行视频播放,这种方式在部分用户电脑是会出现腾讯云视频解码的问题,无法和用户交代,考虑在找一种备用方案进行弥补。
首先我们C# 程序员肯定想到到的是采用VLC 播放器,在网上看了多个版本和案例,基本都是.net framework4.0 及以上版本,找到部分支持.net framework3.5的版本,提供的案例很简单,部分功能总是很难实现,例如播放在线url视频,进度控制,没有相对应的接口,或调用接口没用反应(当然这肯定不是vlc的问题,主要是VLC是C++开发的代码,C#封装调用出的问题,能力有限,源码改不动)。在使用VLC时遇到一个很奇怪的问题,当进度控制和播放在线url视频都调试正常时,点击视频播放的图像,UI直接卡死,感觉应该内部UI线程处理的问题,没能解决,折腾了半天,恋恋不舍的放弃了。
继续百度啊,功夫不负有心人,终于找打一个帖子,C# 视频播放器 采用迅雷Aplayer 绿色使用无需安装 支持VS2022,如获至宝,认真拜读,发现描述都是符合我的项目需求的,但是作者没有留下源码,心里万马奔腾,尝试给作者留言,如石沉大海,至今了无音讯。
还好作者提供了 迅雷APlayer媒体播放引擎-首页 的地址 进入主页后,下载了最新的sdk 发现没有找到APlayerCaller.dll。那就继续逛APlayer论坛,终于找到APlayerCaller.dll的作者发的帖子了,在上面提供下载APlayerCaller.dll的C++封装的源码,直接下载源码干活,下载后发现项目无法采用VS2022编译通过,缺失文件,项目里面作者也没有留编译好的APlayerCaller.dll文件。
根据编译提示进行完善项目,从提供的源码工程上看,作者是采用vs2003编译的,网上找了很久最终也没能安装上vs2003,安装难度感觉很大,各种环境条件不匹配(可能是没有完整的安装程序,缺少必要的组件包)。
首先提示缺少文件:afxres.h,这个头文件 比较好找,下载后放到项目里面,这条错误消息消失了,接着第二个问题来了。
再次编译提示缺少atl.lib,在vs2022安装路径下搜索,找到一个类似的atls.lib,抱着试试看的态度,果然不行。
想了下应该是编译版本的的问题,正好电脑上有之前学vc用的VC6.0安装了之后,找到了alt.lib,放到项目下编译,编译通过了,看到APlayerCaller.dll,心情激动。
按照论坛上提供的方法进行调用,依然报错,找不到指定模块"和BadImageFormatException异常,这个错误比较好解决,是编译平台和调用平台不匹配的问题,调整好平台问题后,顺利解决。
在次调用发现在创建播放器时返回的句柄为0x00000000,还是没有看到播放器的界面。
Handle = APlayer_Create(hParentWnd, x, y, nWidth, nHeight, onMessage, onStateChanged, onOpenSuccess, onSeekCompleted, onBuffer, onVideoSizeChanged, onDownloadCodec, onEvent);
思考片刻感觉是alt.lib的版本问题,既然2003下载不到,看看vs2005,顺利安装vs2005,也找到了alt.lib文件,编译也顺利通过。
创建播放器对象时,出现了新的错误 :程序运行无法加载 C++ DLL“APlayerCaller.dll”: 找不到指定的模块,用依赖工具看了下需要alt80.dll, alt80.dll还有多个dll依赖。找了半天没凑齐这个大家族。
突然想到之前下载的vs2003的安装程序里面应该有alt.lib文件,搜索了一下 果然找到正主了。编译后,创建播放器正常,播放视频正常。
此刻遇到一个新的问题,视频播放窗口大小是固定的,不能缩放,试着处理了多个方法,没有生效。
看到作者的APlayerCaller.dll源码中有写这个方法,但是此方法没有放到导出列表中。将方法放到列表中,重新编译,调用一切正常。
文件下载地址包含迅雷最新解码器调试完成的源码,在vs2022中编译后可以直接使用。