博客
关于我
用QML实现简单音视频播放器的实践
阅读量:657 次
发布时间:2019-03-14

本文共 2786 字,大约阅读时间需要 9 分钟。

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。

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

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

你可能感兴趣的文章
mabatis 中出现< 以及> 代表什么意思?
查看>>
Mac book pro打开docker出现The data couldn’t be read because it is missing
查看>>
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>