Windows平台下,Qt的QMediaPlayer音视频框架,解码能力依赖于windows系统 DirectShow所支持的解码器,这早已不是什么新鲜事,为了让QMediaPlayer支持更多的音视频格式,通常会下载安装诸如K-Lite-codec-pack的第三方解码插件,这样qt媒体播放的能力已经很强大,可以满足大多数的应用场景需求。网上这方面的资料已经很多,在这里就不在复述了。然而实际工作中发现发布,带有Qt媒体播放器安装包安装完成后,还需要引导用户去安装一个第三方的插件,这个对于用户体验确实不太友好,有待优化。本文通过实践,找到一种可行的方案,将第三方解码插件放在安装包一起打包发布,避免多次安装。下面以NSIS打包为例,描述流程。
1、下载安装K-Lite code pack插件
2、找到安装目录Filters\LAV64(我的安装包是64位程序如果小伙伴是32位程序选择LAV文件夹也可以的)。
3、拷贝文件夹到自己的打包目录下
4、注册LAVAudio.ax 、LAVAudio.ax 、LAVSplitter.ax三个组件。
可以通过如下命令行的方式,这需要管理员的权限才能运行成功,(参考博客连接:)
cd/d %~dp0
regsvr32 /s LAVAudio.ax
regsvr32 /s LAVVideo.ax
regsvr32 /s LAVSplitter.ax
本文需要安装的过程中执行一个脚本命令让其注册,并且在卸载的时候将注册信息清除,因此需要在NSIS安装脚本里加入如下脚本代码片段:
安装(参考链接:)
Section -Post
WriteUninstaller "$INSTDIR\uninst.exe"
Exec 'regsvr32.exe /s "$INSTDIR\LAVAudio.ax"'
Exec 'regsvr32.exe /s "$INSTDIR\LAVVideo.ax"'
Exec 'regsvr32.exe /s "$INSTDIR\LAVSplitter.ax"'
SectionEnd
卸载:
Section Uninstall
Delete "$INSTDIR${PRODUCT_NAME}.url"
; 调用宏只根据安装日志卸载安装程序自己安装过的文件
!insertmacro DelFileByLog "$INSTDIR\install.log"
; 清除安装程序创建的且在卸载时可能为空的子目录,对于递归添加的文件目录,请由最内层的子目录开始清除(注意,不要带 /r 参数,否则会失去 DelFileByLog 的意义)
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
ExecWait 'regsvr32.exe /s /u "$INSTDIR\LAVAudio.ax"'
ExecWait 'regsvr32.exe /s /u "$INSTDIR\LAVVideo.ax"'
ExecWait 'regsvr32.exe /s /u "$INSTDIR\LAVSplitter.ax"'
SetAutoClose true
SectionEnd
上面的代码片段是将LAV64文件夹下的插件放在了我的安装包根目录里,这个其实是可以随便放的,只要LAVAudio.ax 、LAVAudio.ax 、LAVSplitter.ax对应的解码插件在个目录,并且对其注册即可。对这个过程有疑问的话,欢迎博客留言交流!