用QML实现简单音视频播放器的实践

2023-10-26

QMLMediaPlayer控件配合VideoOutput对可以对音频文件和视频文件进行播放,代码如下:

VideoOutput {

    id: video_out

    anchors.fill: parent

    source: mediaPlayer

}

 

MediaPlayer {

    id: mediaPlayer

    source: "file:///"+root.ctrl.srcPath

    autoPlay: false

    volume: voice_val.value/100

 

    onPositionChanged: {

        if ((mediaPlayer.position === mediaPlayer.duration) && (mediaPlayer.duration>0))

        {

            //stop

            play_btn.cur_img = "./image/Chat/pause.png";

            mediaPlayer.stop();

            mediaPlayer.seek(0);

            mediaPlayer.position = 0;

        }

    }

}

但是在Windows系列(Windows XPWindows 7Windows 8)平台上,用QMLMediaPlayer控件配合VideoOutput对音频文件和视频文件进行播放,运行时会报错:
DirectShowPlayerService::doRender: Unresolved error code 80040266
解决方法,安装LAV Filters

Qt 中的多媒体播放,底层是使用DirectShowPlayerService,所以安装一个DirectShow解码器Qtwindows上的多媒体播放功能是使用系统的DirectShow,所以安装或者更新DirectShow解码器就行了。

 

Qtlinux下使用gstreamerWindows下使用directshow。总之,Qt没有直接使用解码库,而是对平台相关的播放器框架做了封装,提供了平台无关的APIgstreamer依赖ffmpeg,它里面的很多元素是基于ffmpeg实现的因此,LinuxQt的自带的mediaplayer需要安装gstreamer-0.10-ffmpeg

 

XP下出现的问题:

当用qmlMediaPlayerXP系统下播放视频时,会报错:QtMultimedia : defaultServiceProvider::requestService(): no service found for - “org.qt-project.qt.mediaplayer”.

网上的搜索答案是:

Did you had a wmfengine.dll inside the /plugins/mediaservice directory? If yes, it means that Qt was compiled with WMF support.

If that's the case, then dsengine.dll will only contain camera support, not player support. You need to re-compile dsengine.dll with player support.

因此,需要修改部分QT源码,进行重新编译生成dsengine.dll库。

将生成的dsengined.dll拷至D:\Qt\Qt5.2.0\5.2.0\msvc2010\plugins\mediaservice替换原有文件。然后就是安装编解码库(本人用的是Lav Filters),至此,问题解决!

本人开发的播放器效果如下:


注意,在播放MP4时,有可能因为码率(数据速率)、帧速率的不同,播放出的某些MP4文件可能会花屏,这是需要对其数据进行转换,还是使用ffmpeg.exe进行转换,命令格式如下:

ffmpeg -i aaa.mp4 -b:v 1028k output.mp4 数据速率变为 1028kbps

ffmpeg.exe -i abc.mp4 -qscale 0 -r 24 -y aaa.mp4 码率变为24

ffmpeg.exe -i atest.mp4 -qscale 0 -r 24 -y output.avi   格式由mp4转换为avi

ffmpeg -i atest.mp4 -vf "transpose=1" output.mp4 将视频旋转90

(注意:transpose可以旋转,但是不能用-c:v copy,必须要重新转码)

以上,-iinput)后跟输入数据文件,-y后跟输出文件。转换后用MediaPlayer对转换后的avi进行播放,就可以完美的播放出来了。

 

这里普及一些视频的专业术语:

码流码率 /数据速率:码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点的理解就是取样率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是kb/s或者Mb/s。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内取样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。

当然,码流越大,文件体积也越大,其计算公式是文件体积=时间X码率/8。例如,网络上常见的一部90分钟1Mbps码流的720P RMVB文件,其体积就=5400×1Mb/8=675MB

 

帧速率帧速率也称为FPS(Frames PerSecond)的缩写——/秒。是指每秒钟刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。越高的帧速率可以得到更流畅、更逼真的动画。每秒钟帧数(FPS)越多,所显示的动作就会越流畅。

 

另外:在windows下,可以用system()函数执行wmplayer C:/Users/Joven/Desktop/Media/aaa.mp4打开Windows默认的播放器进行播放。


当用qmlMediaPlayerXP系统下播放视频时,会报错:QtMultimedia : defaultServiceProvider::requestService(): no service found for - “org.qt-project.qt.mediaplayer”.需要修改源码重新编译QtQtMultimedia模块,使用重新生成的dsengine.dll。

具体修改源码的步骤、修改方案与输出库,请点击一下链接:

Qt源码重新编译QtMultimedia模块解决XP播放视频问题


关注我的个人公众号,和我一起交流成长吧:



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用QML实现简单音视频播放器的实践 的相关文章

  • 如何在 Qt 中使用 QTabWidget 创建多行选项卡?

    我尝试使用 QTabWidget 创建一个多行选项卡 如下所示 我也设置了tabPosition 南但我不能有多行选项卡 因为所有选项卡都是水平的 所有选项卡都在一行中 而不是多行 这些是我得到的标签 我读过了这个帖子 https stac
  • 重新加载 tslib 触摸屏校准

    背景 我正在开发一个基于 Qt 的大型 GUI 它处理与触摸屏的所有用户交互 该程序的设计使得用户不需要访问命令提示符即可执行任何操作 包括重新校准触摸屏 我写了一个 tslib 的模仿品ts calibrate作为运行的实用程序QWidg
  • 媒体播放器准备时的进度条

    我试图弄清楚如何在我的媒体播放器准备流文件时显示 正在加载 请稍候 的进度条 现在发生的事情是在歌曲准备好后显示 我怎样才能解决这个问题 mediaPlayerLoadingBar ProgressDialog show PlaylistA
  • 创建 QT 应用程序作为 Windows 上现有基于控制台的应用程序的 GUI

    我正在尝试使用 Qt 为现有应用程序设置一个 GUI 该应用程序旨在在 Windows 命令行中运行 这不仅仅是运行应用程序system 命令 但我需要通过命令行与现有应用程序交互 The system 当我启动现有的可执行文件时 命令会阻
  • 无法在Mac上安装qwt设计器插件

    我无法在 Mac 上安装 qwt 设计器插件 我已经下载了 v 6 1 3 并成功完成了 qmake make 和 sudo make install 问题是 在 usr local qwt 6 1 3 lib 下 我只有文件 qwt fr
  • QSpinBox 具有用于十六进制输入的 Unsigned Int

    这里写了很多关于 QSpinBox 使用 int 作为其数据类型的限制的问题 人们通常希望显示更大的数字 就我而言 我希望能够以十六进制显示无符号 32 位整数 这意味着我希望我的范围为 0x0 0xFFFFFFFF 正常的 QSpinBo
  • QGeoCoordinate:没有这样的文件或目录

    我正在尝试使用 QtLocation 但不能 我不明白为什么 我在 ubuntu 14 04 上使用 qt5 3 2 这很奇怪 因为我将这一行添加到我的 pro 文件中 QT network CONFIG mobility MOBILITY
  • QT布局,如何使水平布局中的小部件向下移动一行而不是溢出窗口

    现在我有一个 QHBoxLayout W W W W W W 我将尺寸调整得更小 得到 W W W W lt gt 我想要 下划线是黑色空间 W W W W W W 我不确定哪种布局可以做到这一点 有人有主意吗 KDE 设置应用程序可以满足
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • Qt同步QNetworkAccessManager获取

    执行同步 QNetworkAccessManager get 的正确方法是什么 The qt wiki http qt shoutwiki com wiki How to wait synchronously for a Signal in
  • qt 读取就绪信号

    我正在尝试与运行 1996 年处理器的设备建立串行连接 这意味着数据传输回我可能需要几秒钟的时间 我知道readyRead每次有新数据可用时都会生成信号 但我的问题是生成多长时间 这也是我可以测试就绪读取是否较低的一种方法 因为如果当它们不
  • Android 中的音频交叉淡入淡出

    我正在开发一个媒体播放器用于我的学习目的 我希望在媒体播放器应用程序中具有交叉淡入淡出功能 但我不知道从哪里开始 我尝试在互联网上搜索但没有运气 我使用的是安卓MediaPlayer所有媒体播放器相关操作的类 任何人都知道任何解决方法可以实
  • App Store 上是否允许嵌入 dylib 的 iOS 8 应用程序?

    iOS 8 现在支持动态框架 是否意味着 App Store 提交允许这样做 似乎以前的开发人员能够在内部应用程序中使用 dylib 但在提交到 App Store 的内容中使用它们会导致您被拒绝 情况仍然如此 还是 iOS 8 中的这一更
  • Qt QML ComboBox 覆盖滚轮事件

    有没有办法覆盖 ComboBox MouseArea 以忽略滚轮事件而不是更改当前索引 ComboBox 本身没有选项可以更改滚轮焦点行为 到目前为止 我尝试使用如下代码覆盖 CB MouseArea 的 onWheel ComboBox
  • 如何在Qt WebKit中将网页保存为“另存为完整网页”

    我需要使用 Qt WebKit 保存网页 类似于 另存为完整网页 以下是我的要求 保存索引html文件 维护实体编码 需要下载所有链接的图像和其他资源 需要将html页面中的资源路径更改为本地下载路径 需要维护网页当前状态 我可以使用 Qt
  • Qt - 如何在 QGraphicsPixmapItem 中显示 gif(动画)图像

    我正在尝试在 QGraphicsPixmapItem 中使用一张闪烁的图像 显示的图像没有动画效果 下面是原始图像 下面是在 QGraphicsPixmapItem 中使用此图像的 QGraphicsScene 有人能说一下如何实现这一目标
  • 使用带有 MSVC 2015 编译器的 QT Creator 5.8

    我是新来的C 和编程 我正在尝试做一个小项目 使用Qt and Qt Creator 我当时用的是MinGW compiler 但对于这个项目 我需要与MSVC compiler 因为我需要使用QtWebEngineWidgets I ha
  • 无法锚定到不是父级或同级 QML QtQuick 的项目

    我正在使用 QML 开发 python 桌面应用程序 我的 QML 文件中有这个 SplitView anchors fill parent orientation Qt Horizontal Rectangle color 272822
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • 如何在C++、Qt、QML、Blackberry 10 Cascades Beta 3 SDK中制作图表/图形(如折线图、条形图、圆形图)等?

    我需要知道如何在 Blackberry 10 Cascades Beta 3 SDK QML Qt C 中制作图表 图表 如果有人可以向我展示一个例子或向我指出一些可以告诉我如何做到这一点的东西 我将不胜感激 您应该查看 QChart js

随机推荐

  • Qt技巧:QProcess与外部程序的调用

    项目做到一定阶段 常常须要在原来的project上调用外部程序 Qt为此提供了QProcess类 QProcess可用于完毕启动外部程序 并与之交互通信 一 启动外部程序的两种方式 1 一体式 void QProcess start con
  • NFS服务安装配置(centos7 nfs-utils示例)

    测试机器 nps server 10 166 205 104 nfs client 10 166 205 101 server端 安装nfs utils和rpcbind sudo yum install nfs utils rpcbind
  • np.random里让你迷糊的随机数函数到底咋区分(结合tensorflow)

    小测 numpy以下哪个函数不能产生正态分布的随机数 A standard normal B randn C random D normal 从 0 1 范围的标准分布中产生1个随机数 以下哪个numpy函数是错误的 A rand B ra
  • Sort 【HDU - 5884】【哈夫曼树】

    题目链接 一开始看到题的时候 竟然读成了是按照升序排序的一串数 害得我WA了两发 还以为是补0补错了 研究了一会补0发现好像没有多大问题 然后就继续了 直到再看了遍题 发现好像是没有给你拍好序的 然后AC 这道题其实哈夫曼树不难 就是补0思
  • 【信创】麒麟操作系统配置在线源及手动查找所需软件包

    获取操作系统信息 命令 nkvers 关注倒数第2行 示例中大版本 V10 小版本 SP2 CPU架构 aarch64 root localhost nkvers Kylin Linux Version Release Kylin Linu
  • ThreadLocal原理以及其安全问题

    ThreadLocal 是一个线程内共享数据的类 其原理是在线程有一个 ThreadLocalMap key是ThreadLocal对象 value是自定义的数据 所以在同一个线程中 用同一个threadlocal去get数据 能取到同样的
  • ansible 离线部署

    1 安装 python 环境 wget https mirrors bfsu edu cn anaconda archive Anaconda3 2022 10 Linux x86 64 sh sh Anaconda3 2022 10 Li
  • VUE+echart绘制地图(伪3D)

    这里以宝鸡地图为示例 其他地图只需更换地图JSON 地图JSON获取通过阿里的datav 地址 阿里云地图获取工具 和data数值即可 效果图如下 首先我们需要创建一个div来盛放地图 这里的div必须给出对应的宽和高 不然地图无法显示 t
  • JavaSE核心API

    还在更新中 没有JavaSE基础的小伙伴可以先看看这篇哦 写的非常的详细 Java语言基础 文章目录 API介绍以及文档的使用 文档注释的规范 Javadoc生成项目文档 String的介绍 重写equals方法 字符串常量池 String
  • 帮你快速理解什么是MFC(Windows环境下)

    我是荔园微风 作为一名在IT界整整25年的老兵 今天总结一下Windows环境下的MFC到底是一个什么技术 早在1998年 MFC绝对是技术界的一个热门名词 现在似乎提的人很少 但其他MFC的很多程序仍在世界上各个角落运行着 做为一名系统架
  • 静态测试 vs 动态测试

    静态测试 静态测试又可分为代码走查 Walkthrough 代码审查 Inspection 技术评审 Review 代码走查 Walkthrough 开发组内部进行的 采用讲解 讨论和模拟运行的方式进行的查找错误的活动 代码审查 Inspe
  • (二)Jupyter Notebook, numpy, matplotlib的使用

    笔记 机器学习入门专栏笔记对应jupyternotebook以及封装的各种算法个人笔记 如有错误 感谢指出 机器学习文档类资源 CSDN文库 二 Jupyter Notebook numpy matplotlib的使用 下载anaconda
  • 微信扫码登录详细操作流程(微信公众平台开发)

    在平常的业务开发中 经常会涉及到扫码登录的案例 下面我将对扫码登录流程做简要概述 1 概念 首先需要清楚的是扫码登录大体上有两种实现方式 重点 一种是基于微信公众平台的扫码登录 另一种是基于微信开放平台的扫码登录 注意这两个平台一定要区分开
  • org.mybatis.generator.exception.XMLParserException: XML Parser Error on line 12: 对实体 “useUnicode“ 的

    org mybatis generator exception XMLParserException XML Parser Error on line 12 对实体 useUnicode 的引用必须以 分隔符结尾 在使用mybatis逆向工
  • shell编程基础

    1 它必须以如下行开始 必须放在文件的第一行 bin sh 符号 用来告诉系统执行该脚本的程序 本例使用 bin sh 编辑结束并保存后 如果要执行该脚本 必须先使其可执行 chmod x filename 此后在该脚本所在目录下 输入 f
  • 华为OD机试 - 字符串变换最小字符串(Java)

    题目描述 给定一个字符串s 最多只能进行一次变换 返回变换后能得到的最小字符串 按照字典序进行比较 变换规则 交换字符串中任意两个不同位置的字符 输入描述 一串小写字母组成的字符串s 输出描述 按照要求进行变换得到的最小字符串 备注 s是都
  • Oracle环境变量配置

    情况描述 最近在配置plsql环境后 plsql总是连接不上 由于对自己的记忆力过度自信 导致这个简单的问题不能得到解决 现在记录下来作为以后的参考 一 客户端安装 官网下载orcle对应版本的客户端 然后执行安装 二 环境变量 需要配置以
  • Futter 屏幕适配框架flutter_ScreenUtil 用法

    参考 前言 各位同学大家好 大家在做app开发的时候都会遇到屏幕适配的问题 安卓里面有dp iOS里面有pt 单位给我们用来处理屏幕适配 除此之外安卓还有 autosize等框架给我们使用 iOS也对应屏幕适配方案给我们使用 那么在flut
  • 基于Python的接口自动化unittest测试框架和ddt数据驱动详解

    这篇文章主要介绍了基于Python的接口自动化unittest测试框架和ddt数据驱动详解 本文给大家介绍的非常详细 对大家的学习或工作具有一定的参考借鉴价值 需要的朋友可以参考下 目录 引言 一 unittest测试框架 二 ddt数据驱
  • 用QML实现简单音视频播放器的实践

    用QML的MediaPlayer控件配合VideoOutput对可以对音频文件和视频文件进行播放 代码如下 VideoOutput id video out anchors fill parent source mediaPlayer Me