用QML的MediaPlayer控件配合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 XP、Windows 7、Windows 8)平台上,用QML的MediaPlayer控件配合VideoOutput对音频文件和视频文件进行播放,运行时会报错:
DirectShowPlayerService::doRender: Unresolved error code 80040266
解决方法,安装LAV Filters
Qt 中的多媒体播放,底层是使用DirectShowPlayerService,所以安装一个DirectShow解码器。Qt在windows上的多媒体播放功能是使用系统的DirectShow,所以安装或者更新DirectShow解码器就行了。
Qt在linux下使用gstreamer,Windows下使用directshow。总之,Qt没有直接使用解码库,而是对平台相关的播放器框架做了封装,提供了平台无关的API。gstreamer依赖ffmpeg,它里面的很多元素是基于ffmpeg实现的。因此,Linux下Qt的自带的mediaplayer需要安装gstreamer-0.10-ffmpeg。
在XP下出现的问题:
当用qml的MediaPlayer在XP系统下播放视频时,会报错: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,必须要重新转码)
以上,-i(input)后跟输入数据文件,-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默认的播放器进行播放。
当用qml的MediaPlayer在XP系统下播放视频时,会报错:QtMultimedia : defaultServiceProvider::requestService(): no service found for - “org.qt-project.qt.mediaplayer”.需要修改源码重新编译Qt的QtMultimedia模块,使用重新生成的dsengine.dll。
具体修改源码的步骤、修改方案与输出库,请点击一下链接:
Qt源码重新编译QtMultimedia模块解决XP播放视频问题
关注我的个人公众号,和我一起交流成长吧: