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

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),至此,问题解决!

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

用QML实现简单音视频播放器的实践_第1张图片

注意,在播放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播放视频问题


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

用QML实现简单音视频播放器的实践_第2张图片


你可能感兴趣的:(Qt/QML的实践积累)