QMediaPlayer与解码器浅析
本文最后更新于:2023年9月26日 下午
前情提要
众所周知,Qt
可以很方便地使用QMediaPlayer
类播放音视频(mp3、mp4等)
但是,当我们兴致冲冲地开始play
时,却只收获了一行Error:
DirectShowPlayerService::doRender: Unresolved error code 80040266
这是因为QMediaPlayer
底层是使用DirectShowPlayerService
,这是一个基于DirectShow
框架的后端实现
但是DirectShowPlayerService
没有自带解码库,而是对平台相关的播放器框架做了封装,提供了平台无关的API
且DirectShow
框架默认只支持一些常见的格式(如WMV、AVI、MPG等),如果要播放其他格式的音视频文件,就需要额外安装解码器
DirectShow 中支持的格式 - Win32 apps | Microsoft Learn
Pre - 正片
好的 现在我们知道了QMediaPlayer
不能单独使用,除某些格式外,需要配合第三方解码器使用
那么什么解码器合适呢?
随便上网一搜报错,给出的答案都是LAVFilters
直接干,噼里啪啦安装到Qt
目录下(不确定安装位置是否有要求)
安装过程会自动向Windows
注册解码器,无需我们手动操作(不需要在Qt中指定解码器位置之类的)
好的,现在可以播放mp3
音频文件了,よかった收工
正片
时光荏苒,斗转星移,转眼间,数年过去了
AirpodsDesktop需要使用QMediaPlayer
播放.avi
视频
出现了令人费解的无法渲染和卡顿现象
起初,没有人在意这场灾难。这只不过是一次卡顿,一顿黑屏,一个视频的灭绝,一个控件的消失。直到每个解码器和这场灾难息息相关。
是的,经过一顿搜索,这与解码器有着脱不开的干系
在卸载了LAVFilters
之后,.avi
视频可以正常播放了
但是mp3播放不了了aaaa
也就是说mp3
需要依赖LAVFilters
解码,avi
不需要,且LAVFilters
还会造成反作用
又经过一顿搜索发现这种现象并不罕见,解决方案:利用效果更好的K-Lite替代LAVFilters
酱紫mp3
和avi
都可以正常播放啦,可喜可贺!
One More Thing
等一下,先别高兴得太早
大哥,你开发的可是软件,是要给用户使用的,解码器怎么安装
首先,从安装难度和安装包大小来说,K-Lite
要远高于LAVFilters
他俩都是基于FFmpeg
开发的,而且貌似K-Lite
内含一个LAVFilters
(NewBing说的)
LAVFilters所包含的组件较少,大概就是dll + ax + manifest
(在一个文件夹中)
只要在安装时,在用户电脑里自动执行ax的安装脚本即可
参考:在Windows下使用QMediaPlayer实现播放视频CSDN博客
但是K-Lite
可能没这么方便
如果让用户手动安装的话,还需要一些指引(K-Lite
选项与步骤繁多)
所以从这个层面来说LAVFilters
更胜一筹(当然为了全面功能性,还是得考虑K-Lite)
特事特办
不过,在这个例子中,AirpodsDesktop
使用的是avi
文件,QMediaPlayer
不需要额外的解码器就可以播放这个古老的格式,而我的Right-Player需要解码器来播放mp3
为了调和这个矛盾,我们可以在安装LAVFilters
时,取消勾选视频解码器(但是要保留Splitter分离器)
疑问
可能有人会想,为什么Edge这样的软件不需要额外安装解码器呢?
NewBing
的解释如下:
Edge也是使用DirectShow框架来播放音频和视频文件,但它不是使用DirectShowPlayerService,而是使用自己的后端实现,它可以利用Windows Media Foundation(WMF)或Media Foundation(MF)来提供更高效和更稳定的解码服务
Edge不需要LAVFilters解码器,是因为它可以使用WMF或MF来提供解码器,而WMF或MF默认支持更多的视频格式,例如H.264、H.265、VP8、VP9等。这些格式涵盖了大部分的网络视频和流媒体服务,因此Edge可以直接播放这些视频文件,不需要额外安装解码器。
Ref
QMediaPlayer视频没有画面显示,或播放卡顿问题解决_vs中通过qmediaplayer 加载不出视频-CSDN博客
DirectShow 中支持的格式 - Win32 apps | Microsoft Learn
QT总结11——QMediaPlayer无法显示视频_qt中qmediaplayer播放视频无反应-CSDN博客
QT视频播放不出来,报错 DirectShowPlayerService::doRender: Unresolved error code 80040266——没有安装视频解码器-CSDN博客