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

酱紫mp3avi都可以正常播放啦,可喜可贺!

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博客

SpriteOvO/AirPodsDesktop: ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) (github.com)

MrBeanCpp/Right-Player: 一款轻量级音乐播放器,拥有简洁美观的UI设计 (github.com)


QMediaPlayer与解码器浅析
https://mrbeancpp.github.io/2023/09/26/QMediaPlayer与解码器浅析/
作者
MrBeanC
发布于
2023年9月26日
许可协议