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章

原文地址:https://www.cnblogs.com/linuxAndMcu/p/11986616.html

时间: 2024-10-04 23:03:55

Qt Quick 多媒体 - 播放音乐和视频的相关文章

Android实例-MediaPlayer播放音乐和视频(XE8+小米2)

结果: 1.播放视频需要手动放入MediaPlayerControl1控件,设置MediaPlayerControl1.MediaPlayer := MediaPlayer1; 2.播放声音文件正常,但播放器视时发现,第一边正常第二边就报错了(哪位大神知道的,请M我哦,先谢谢了). 3.打包时需要打入MP3与MP4文件,路径为"assets\internal\". 实例代码: 1 unit Unit1; 2 3 interface 4 5 uses 6 System.SysUtils,

基于Qt Phonon模块实现音乐播放器

这次使用Qt实现的是一个本地音乐播放器,可以播放下载在计算机本地的音乐,提供了添加歌曲,歌曲列表,清空列表的功能.默认歌曲列表循环播放.音乐播放的实现主要依赖的是Qt 的多媒体框架phonon.该音乐播放器的开发环境是Qt4.8.5+Qtcreator2.8.0. 音乐播放器界面如下: 主界面 歌曲列表 一.使用Qt Phonon框架播放音乐 想要写一个音乐播放器,最基本的当然就是要知道使用这个框架来播放音乐以及一些基本的播放控制比如暂停.停止.下一首等.只有知道了这些基本的东西,后面才可以将界

iOS开发-- 利用AVPlayer播放远程音乐和视频

一.简单的播放音乐和视频,播放视频的工具栏需要自己写 二.利用老师封装的框架实现视频播放 链接:http://pan.baidu.com/s/1hrEKlus 密码:8e7g

多媒体(音乐、视频播放器,相机)

1.音乐.视频 QMediaPlayer是多媒体核心类,可以播放音乐.视频.要使用MediaPlayer,需要引入QtMultimedia 5.0或以上版本.另外在pro文件中需要添加QT += multimedia 音乐播放用MediaPlayer足以满足需求,但是视频需要VedioOutput元素和MediaPlayer结合,这个VideoOutput用来渲染视频,也可以作为相机的取景器(预览窗口). 多媒体元信息:就是描述媒体的信息,包括歌曲的专辑.发行时间.艺术家,或者视频的分辨率.编码

Qt Quick播放Gif动画

Qt Quick提供了一个类 AnimatedImage ,可以播放 Gif 动画,使用简单,这里是一个示例. 这里是用到的 Gif 图片: AnimatedImage AnimatedImage 提供了五个属性: currentFrame,指示当前正在播放的帧序号 frameCount,指示图片的总帧数 paused,表示是否暂停,设置它也可以暂停或继续播放 playing,指示动画是否在播放,默认为 true ,意思是 AnimatedImage 对象创建后立即开始播放 source,类型为

Unity3d 5.0 动态播放视频,播放音乐

1.Unity3d 5.0  动态播放视频 工具:Mobile Movie Texture.unitypackage2.1.1 问题描述:目前这个第三方播放视频工具不提供播放时音乐,并且网上教材都是将视频直接拖曳.无法动态更改需要播放的视频 解决方法: 核心代码:  m_movieTexture.Path = "MovieSamples/HandOfFate.ogv"; 试例Demo: [RequireComponent(typeof(MMT.MobileMovieTexture))]

Qt Quick综合实例之文件查看器

如果你基于Qt SDK 5.3.1来创建一个Qt Quick App项目,项目模板为你准备的main.qml文档的根元素是ApplicationWindow或Window.这次我们就以ApplicationWindow为例,围绕着它实现一个综合实例:文件查看器.通过文件查看器的实现,我们来再次领略一下Qt Quick的犀利. 版权所有foruok,转载请注明出处:http://blog.csdn.net/foruok. 本实例将会用到下列特性: ApplicationWindow MenuBar

实验6 在应用程序中播放音频和视频

实验报告 课程名称 基于Android平台移动互联网开发 实验日期 4月15日 实验项目名称 在应用程序中播放音频和视频 实验地点 S3002 实验类型 □验证型    √设计型    □综合型 学  时 一.实验目的及要求(本实验所涉及并要求掌握的知识点) 实现在应用程序中处理音频和视频. [要求] 1) 实现播放音频,音频播放控制: 2) 实现播放视频,视频播放控制: 3) 使用Service服务播放项目源文件中的音乐. 二.实验环境(本实验所使用的硬件设备和相关软件) (1)PC机 (2)

实验六 在应用程序中播放音频和视频

实验报告 课程名称 基于Android平台移动互联网开发 实验日期 2016年4月15日 实验项目名称 在应用程序中播放音频和视频 实验地点 S30010 实验类型 □验证型    √设计型    □综合型 学  时 2 一.实验目的及要求(本实验所涉及并要求掌握的知识点) 1.实现在应用程序中处理音频和视频. 2.实现播放音频,音频播放控制: 3. 实现播放视频,视频播放控制: 4. 使用Service服务播放项目源文件中的音乐. 二.实验环境(本实验所使用的硬件设备和相关软件) (1)PC机