Qt Quick 多媒体 - 播放音乐和视频
MediaPlayer 是 QML 提供的核心多媒体类,可以播放音频、视频。要使用 MediaPlayer,需要引入 QtMultimedia 模块,在 QML 文档的开始加入 “import QtMultimedia 5.0” 语句。QML 中的 MediaPlayer 是 Qt C++ 中的多媒体框架在 QML 环境中的代言人,假如以 Qt QuickApp 为模板创建项目,你还需要在 pro 文件中加入语句:QT += multimedia
。
一、播放音乐
先看最简单的播放音乐的例子,simple_music.qml,就十来行代码:
import QtQuick 2.2
import QtMultimedia 5.0
Rectangle {
width: 200;
height: 100;
MediaPlayer {
autoPlay: true;
source: "wangjie_game_and_dream.mp3";
}
}
关于 MediaPlayer 的,就 4 行代码。在 QML 文档同目录下放置对应的 MP3 文件,执行 “qmlscenesimple_music.qml” 命令,音乐就会响起来。
在这个简单的示例中,source 属性指定了要播放的文件,它的类型是 url,它能接受绝对路径、相对路径、有效的 http 链接。autoPlay 属性设置为 true,指示 MediaPlayer 对象创建后立即开始播放。如果你觉得立马开始播放不太好,也可以在你认为合适的时候调用 MediaPlayer 的 play() 方法。
如果你想知道音乐的时长,访问 duration 属性,它是整型值,单位是毫秒,实现 onDurationChanged 信号处理器,可以取到时长。
如果你还想知道播放进度,可以访问 position 属性,它是整型值,单位是毫秒,实现一 个 onPositionChanged 信号处理器,就可以实时显示进度。
调用 pause() 方法暂停播放,调用 stop() 方法停止播放。而播放状态变化时,会发出 playbackStateChanged() 信号,在 onPlaybackStateChanged 信号处理器内,可以读取枚举类型的 playbackState 属性,它取 MediaPlayer.PlayingState、MediaPlayer.PausedState、MediaPlayer. StoppedState 三个值中的一个。
seekable 属性指示媒体是否支持 seek,当它为 true 时,你就可以调用 seek (offset) 方法来定位播放了。参数 offset 是相对于当前位置的偏移量,单位是毫秒。注意,操作可能是异步的,当方法返回时 position 属性不一定会立即变成新的。
静音可以通过 imited 属性读取、设置,音量通过 volume 属性读取、设置。
好啦,常用操作就这么多,现在让我们来打造一个功能更丰富的简易音乐播放器。(另外需要用到 FlatButton,其 qml 文件内容,由于篇幅原因未贴出。)simple_music_player.qml 的内容如下:
import QtQuick 2.2
import QtMultimedia 5.0
Rectangle {
width: 320;
height: 240;
color: "black";
property var utilDate: new Date();
function msecs2String(msecs){
utilDate.setTime(msecs);
return Qt.formatTime(utilDate, "mm:ss");
}
MediaPlayer {
id: player;
source: "wangjie_game_and_dream.mp3";
onPositionChanged: {
progress.text = msecs2String(position) + progress.sDuration;
}
onDurationChanged: {
progress.sDuration = " / " + msecs2String(duration);
}
onPlaybackStateChanged: {
switch(playbackState){
case MediaPlayer.PlayingState:
state.text = "播放中";
break;
case MediaPlayer.PausedState:
state.text = "已暂停";
break;
case MediaPlayer.StoppedState:
state.text = "停止";
break;
}
}
onStatusChanged: {
switch(status){
case MediaPlayer.Loaded:
console.log(metaData.albumArtist, metaData.albumTitle, metaData.author, metaData.channelCount);
break;
}
}
}
Row {
id: controller;
anchors.top: parent.verticalCenter;
anchors.horizontalCenter: parent.horizontalCenter;
anchors.topMargin: 4;
spacing: 4;
FlatButton {
width: 50;
height: 50;
iconSource: "ic_rew.png";
onClicked: if(player.seekable)player.seek(player.position - 5000);
}
FlatButton {
width: 50;
height: 50;
iconSource: "ic_pause.png";
onClicked: player.pause();
}
FlatButton {
width: 50;
height: 50;
iconSource: "ic_play.png";
onClicked: player.play();
}
FlatButton {
width: 50;
height: 50;
iconSource: "ic_stop.png";
onClicked: player.stop();
}
FlatButton {
width: 50;
height: 50;
iconSource: "ic_ff.png";
onClicked: if(player.seekable)player.seek(player.position + 5000);
}
}
Text {
id: progress;
anchors.left: controller.left;
anchors.bottom: controller.top;
anchors.bottomMargin: 4;
color: "white";
font.pointSize: 12;
property string sDuration;
}
Text {
id: state;
anchors.left: progress.left;
anchors.bottom: progress.top;
anchors.bottomMargin: 4;
color: "white";
font.pointSize: 12;
}
Text {
id: metaInfo;
anchors.left: state.left;
anchors.bottom: state.top;
anchors.bottomMargin: 4;
color: "blue";
font.pointSize: 14;
}
}
使用 qmlscene 加载 simple_music_player.qml,效果如下图所示。
这个版本的播放器依旧很简单,只能播放一个内置的文件,也没有可拖动的进度条,不过 MediaPlayer 的常用接口都用到了。界面上的那些事儿,播放列表那些事儿,都可以在此基础上加进来,再找些漂亮的图片,你就可以打造出一个酷炫的音乐播放器了。
二、播放视频
播放视频比音乐稍稍复杂一些,需要使用 VideoOutput 元素与 MediaPlayer 配合。 VideoOutput 用来渲染视频,也可以作为相机的取景器(预览窗口),最简单的用法是,你只需要将其 source 属性指向一个 MediaPlayer 对象即可。 simple_video.qml 演示如何播放一个本地视频:
import QtQuick 2.2
import QtMultimedia 5.0
Rectangle {
width: 720;
height: 480;
MediaPlayer {
id: player;
source: "D:/game/helloMv/3D1.mp4";
onError: {
console.log(errorString);
}
}
VideoOutput {
anchors.fill: parent;
source: player;
}
MouseArea {
anchors.fill: parent;
onClicked: {
console.log("call play");
player.play();
}
}
}
如你所见,视频的示例相比音频,仅仅多了一个 VideoOutput 对象,其 source 属性为 player。当用鼠标左键单击时,调用 play() 播放视频。
如果你在 Windows 平台上使用 qmlscene 加载 simple_video.qml,不一定能够播放,要确保你的系统安装了必需的 DirectShow Filter 才行。如果不能播放,可以尝试安装 LAV Filters(请找度娘要下载地址,亲测安装即可,无序配置)。LAV Filters 是一组基于 ffmpeg 的 DirectShow 分离器和音视频解码器,支持绝大多数常见的音视频格式。
下图是播放效果图:
视频播放的控制,如暂停、停止、定位等,与音乐一样,不多说了。接下来我们看看如何获取多媒体的元信息。
三、多媒体元信息
何谓多媒体元信息?就是媒体以外、用来描述媒体的那些信息,比如一首歌,专辑、发行时间、艺术家、采样率等,就是元信息;又如一个视频,分辨率、编码格式、帧率等,就是元信息。
MediaPlayer 对象有个分组属性 metaData,它包含了方方面面的元信息,通过访问它,你就可以知道多媒体的描述信息。不过呢,这些看上去很美的元信息,不一定可用哦,要看 MediaPlayer 使用的底层的播放服务是否能够提供这些。如果你需要这些信息,可以这么获取: 在 onStatusChanged 信号处理器中,读取 status 属性,当它的值为 MediaPlayer.Loaded 时, 访问你想要的信息。就像下面这样:
MediaPlayer {
id: player;
source: "wangjie_game_and_dream.mp3";
onStatusChanged: {
switch(status){
case MediaPlayer.Loaded:
console.log(metaData.albumArtist,
metaData.albumTitle,
metaData.author, metaData.channelCount);
break;
}
}
}
我用的 MP3 文件,只能取到 channelCount 这个信息,输出结果为 2,说明是双声道。 如果你想了解多媒体元信息的更多细节,请在 Qt 帮助中查看 MediaPlayer 的文档。
本节的代码请去github - multimedia自行下载。
参考:
《Qt Quick核心编程》第14章
Qt Quick 多媒体 - 播放音乐和视频的更多相关文章
- Android播放器推荐:可以播放本地音乐、视频、在线播放音乐、视频、网络收音机等
下载链接:http://www.eoeandroid.com/forum.php?mod=attachment&aid=MTAxNTczfGMyNjNkMzFlfDEzNzY1MzkwNTR8 ...
- Android实例-MediaPlayer播放音乐和视频(XE8+小米2)
结果: 1.播放视频需要手动放入MediaPlayerControl1控件,设置MediaPlayerControl1.MediaPlayer := MediaPlayer1; 2.播放声音文件正常, ...
- 基于Qt Phonon模块实现音乐播放器
这次使用Qt实现的是一个本地音乐播放器,可以播放下载在计算机本地的音乐,提供了添加歌曲,歌曲列表,清空列表的功能.默认歌曲列表循环播放.音乐播放的实现主要依赖的是Qt 的多媒体框架phonon.该音乐 ...
- iOS开发-- 利用AVPlayer播放远程音乐和视频
一.简单的播放音乐和视频,播放视频的工具栏需要自己写 二.利用老师封装的框架实现视频播放 链接:http://pan.baidu.com/s/1hrEKlus 密码:8e7g
- iOS音频与视频的开发(一)-使用AVAudioPlayer播放音乐、使用AVPlayerViewController播放视频
iOS的多媒体支持非常强大,它提供了多套支持多媒体的API,无论是音频.视频的播放,还是录制,iOS都提供了多种API支持.借助于这些API的支持,iOS应用既可以查看.播放手机相册中的照片.视频,也 ...
- iOS多媒体总结&进入后台播放音乐
1. 播放mp3需要导入框架,AVFoundation支持音频文件(.caf..aif..wav..wmv和.mp3)的播放. #import <AVFoundation/AVFoundatio ...
- 与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成
原文:与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成 [索引页][源码下载] 与众不同 win ...
- win8 应用商店。 app下载的音乐和视频软件能打开,不能正常播放 解决方法
win8 应用商店.app下载的音乐和视频软件能打开,不能正常播放 安装完win8之后,下载了PPS,可以正常播放.但是过了几天之后,就不能播放了,又从网络上下载了其他的音乐和视频相关的软件, 都不可 ...
- embed标签的使用(在网页中播放各种音频视频的插件的使用)
播放器插件使用说明: 代码:< EMBED src=“music.mid”autostart=“true”loop=“2”width=“80”height=“30”> src:音乐文件的路 ...
随机推荐
- JavaScript定时器越走越快的问题
目录 JavaScript定时器越走越快的问题 (setinterval)多次初始化 清除(clearInterval)的失效 解决方法 JavaScript定时器越走越快的问题 之前在项目中写了定时 ...
- 2018-8-10-win10-uwp-拖动控件
原文:2018-8-10-win10-uwp-拖动控件 title author date CreateTime categories win10 uwp 拖动控件 lindexi 2018-08-1 ...
- 写入文件writelines 换行问题
知识点:在python中没有数组的概念,有列表.元组.字典的概念 问题描述: 在写循环语句的时候,我需要把输出的列表存放到文件上,但是如果没有换行的话,存下的文件就是一坨的字. 所以在存入文件的时候就 ...
- pip下载速度慢解决方法
添加镜像链接 解决方式: 更改pip的数据源.目前国内比较知名的有豆瓣的,清华的.都是pipy官网的镜像. 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里 ...
- ASP.NET Core系列:依赖注入
1. 控制反转(IoC) 控制反转(Inversion of Control,IoC),是面向对象编程中的一种设计原则,用来降低代码之间的耦合度. 1.1 依赖倒置 依赖原则: (1)高层次的模块不应 ...
- SQL的概念与发展 - 极客时间学习笔记
了解SQL SQL的两个重要标准是SQL92和SQL99. SQL语言的划分 DDL,也叫Data Definition Language,也就是数据定义语言,用来定义数据库对象,包括数据库.数据表和 ...
- [linux]在使用rsync时需要注意的小细节
很简单:前一个目录末尾是目录的话,最后是否带/是有区别的. 具体看测试: # usr @ the-pc in ~/cptest02 [2:28:02] $ ll 总用量 0 # usr @ the-p ...
- 3-3 groupby操作
Pandas章节应用的数据可以在以下链接下载: https://files.cnblogs.com/files/AI-robort/Titanic_Data-master.zip .caret, . ...
- python 类 专有方法
__init__ : 构造函数,在生成对象时调用 __del__ : 析构函数,释放对象时使用 __repr__ : 打印,转换 __setitem__ : 按照索引赋值 __getitem__: 按 ...
- python hash 哈希值
自增知识点 1,哈希 什么是可哈希(hashable)? 简要的说可哈希的数据类型,即不可变的数据结构(字符串str.元组tuple.对象集objects). 哈希有啥作用? 它是一个将大体量数据转化 ...