本文档将对 在 SyberOS 中在 Qt 中如何处理和使用多媒体资源进行描述。
本文档将对 SDK 中如何使用 Qt 接口处理多媒体资源进行详细描述,同时也为 SyberOS 应用程序开发人员提供参考。
本文描述了如何在 SDK 中使用 Qt 多媒体接口开发多媒体应用程序,具体包含 4 部分:
注:查看此文档默认用户已经了解如何在 SyberOS 的 SDK 中如何创建一个应用程序。如不了解创建应用程序流程,请查看文档SyberOS 应用程序简介。
QtMultimedia 是处理多媒体内容必不可少的一个模块,该模块提供了一组丰富的 QML 类型和 C++类去处理多媒体内容。
QtMultimedia 模块的调用分为两种方式,通过 QML 调用以及通过 c++调用:
1)在 QML 文件中可以使用如下 import 语句将 QML 类型导入你的应用程序中:
import QtMultimedia 5.0
2)在应用程序中使用 C++类去实现多媒体内容处理,则需要在文件中包含如下内容:
+在 pro 文件中添加如下内容:
QT += multimedia
+在.h 文件中包含 QtMultimedia 类:
#include <QtMultimedia>
下列表中提供 QtMultimedia 模块中重要的 QML 类型:
| QML 类型 | 描述 |
|---|---|
| Audio | 在场景中添加音频播放功能 |
| Camera | 调出摄像头的取景框 |
| MediaPlayer | 向场景中添加媒体播放功能。它和 Audio 类型相同,但是和 VideoOutput 配合使用可播放视频 |
| Radio | 用于实现收音机功能 |
| Video | 在场景中添加视频播放功能,使用 MediaPlayer 和 VideoOutput 类型实现视频播放 |
下列表中提供该模块中重要的 C++类:
| C++类名 | 描述 |
|---|---|
| QAudioOutput | 发送音频数据到音频输出设备 |
| QCamera | 调出摄像头的取景框 |
| QCameraImageCapture | 和 QCamera 配合使用实现录像 |
| QMediaPlayer | 根据 source 播放媒体 |
| QRadioTuner | 用于实现收音机功能 |
| QVideoRendererControl | 控制视频数据 |
本文档将重点讲解如何使用 c++处理多媒体内容。
更多内容可参考 qt 官网对QtMultimedia的介绍。
QMediaPlayer 是一个强大的多媒体播放类,音频播放以及视频播放都需要用到该类。
当用户想要播放音频资源时,可以使用 QMediaPlayer 类实现其功能。其实现步骤如下:
1)按照《SyberOS 应用程序简介.pdf》文档中的流程新建 audio 项目,并在.pro 文件中添加如下信息:
QT += multimedia
2) 新建文件 audio.h,并在文件中引用如下内容:
#include <QtMultimedia>
3) 定义 QMediaPlayer 类型的指针,在.cpp 文件中会通过该指针实现音频播放相关内容:
QMediaPlayer *player;
4) 新建文件 audio.cpp,并进行功能的实现,例如以下几个音频播放功能:
player = new QMediaPlayer;
void mediaPlayer::play()
{
player->play(); //实现播放音频功能
}
void mediaPlayer::pause()
{
player->pause(); //暂停音频播放
}
void mediaPlayer::stop()
{
player->stop(); //停止音频播放
}
void mediaPlayer::setPosition(bool isSpeed)
{
if(isSpeed)
{
player->setPosition(player->position() + 5000); //快进5秒
}else
{
player->setPosition(player->position() - 5000); //快退5秒
}
}
5) 通过 QMediaPlaylist 可以设置播放列表,其实现如下显示:
playlist = new QMediaPlaylist;
player->setPlaylist(playlist);
void mediaPlayer::setPlayerList(QStringList list)
{
foreach (QString strValue, list)
{
QString path=QDir::toNativeSeparators(strValue);
if(!path.isEmpty())
{
playlist->addMedia(QUrl::fromLocalFile(path));
}
}
}
6) 将自己定义的类暴露给 QML,以供 QML 中实现功能:
m_mp = new mediaPlayer;
m_view->rootContext()->setContextProperty("mediaPlayer", m_mp);
7) 在 QML 中通过使用属性“mediaPlayer”来调用底层的功能:
var playerList = new Array
playerList.push("/home/user/chongerfei.mp3")
mediaPlayer.setPlayerList(playerList) //设置播放列表
mediaPlayer.play() //播放
mediaPlayer.pause()//暂停
...
8) 其 QMediaPlayer 类拥有大量的属性/函数/信号/槽去操作多媒体,例如播放状态/错误状态等等,本文档
不进行一一介绍,更多设置详见 qt 官网对QMediaPlayer的介绍。
在音频播放一章节中介绍,QMediaPlayer 适用于音频播放与视频播放,所以其视频播放功能同样由
QMediaPlayer 类去实现,但是在使用 QMediaPlayer 的基础上,需要配合取景器显示播放内容。
QMediaPlayer 的使用方式参见音频播放介绍。本章节重点介绍如何使用 QML 中的 VideoOutput 去显示视频画面。
在 QML 文件中显示视频画面,需使用 VideoOutput:
VideoOutput {
anchors.fill: parent
source: videoOutput
fillMode: VideoOutput.PreserveAspectFit
}
根据 qt 帮助手册所述,可通过如下步骤实现对 source 的赋值:
1)创建文件 QVideoOutput.h,并新建 class 继承 QMediaPlayer 类,且在类中添加属性 videoSurface(包含对该属性的读写)。 其实现如下:
#include <QMediaPlayer>
#include <QAbstractVideoSurface>
class QVideoOutput:public QMediaPlayer
{
Q_OBJECT
Q_PROPERTY(QAbstractVideoSurface* videoSurface READ getVideoSurface
WRITE setVideoSurface )
public:
QVideoOutput(QObject *parent = 0, Flags flags = 0);
public slots:
void setVideoSurface(QAbstractVideoSurface *surface);
QAbstractVideoSurface * getVideoSurface();
public:
QAbstractVideoSurface* m_surface;
};
2)创建文件 QVideoOutput.cpp,并实现 QVideoOutput.h 中的功能:
#include <QDebug>
#include "src/QVideoOutput.h"
QVideoOutput::QVideoOutput(QObject *parent, Flags flags)
{
}
void QVideoOutput::setVideoSurface(QAbstractVideoSurface *surface)
{
qDebug() << "changing surface";
m_surface = surface;
setVideoOutput(m_surface);
}
QAbstractVideoSurface* QVideoOutput::getVideoSurface()
{
return m_surface;
}
3)在音频播放一章节中的使用的 QMediaPlayer 都替换为 QVideoOutput,例如:
player = new QMediaPlayer; //音频播放
player = new QVideoOutput; //视频播放
4)添加函数 get_mediaplayer(),其代码如下所示:
QVideoOutput* mediaPlayer::get_mediaplayer()
{
return player; //返回QVideoOutput,
}
5)暴露该函数,以供 QML 调用:
//返回类型为QVideoOutput
QVideoOutput *cVideoOutput = m_mp->get_mediaplayer();
//注册为QML中可调用的属性
m_view->rootContext()->setContextProperty("videoOutput", cVideoOutput);
6)将注册的属性"videoOutput"赋给 VideoOutput 类型中的“source”属性:
VideoOutput {
anchors.fill: parent
source: videoOutput
fillMode: VideoOutput.PreserveAspectFit
}
通过上述步骤可完成简单的视频画面播放,QMediaPlayer 提供了大量的接口/信号等信息供用户进行视频设
置,其详细介绍请参考 qt 官网对QMediaPlayer的介绍。
QCamera 提供了系统照相机设备的接口。使用该类可以通过摄像头设备获取图片或视频,该类同样需要配合 QML 中的 VideoOutput 去显示取景器。 其实现步骤如下:
1)新建文件 QCameraOutput.h,在该文件中定义一个新类继承 QCamera:
#include <QObject>
#include <QCamera>
class QCameraOutput:public QCamera
{
Q_OBJECT
Q_PROPERTY(QObject *mediaObject READ mediaObject NOTIFY mediaObjectChanged
SCRIPTABLE false DESIGNABLE false)
public:
QCameraOutput();
~QCameraOutput();
QObject *mediaObject() { return this; }
signals:
void mediaObjectChanged();
};
2)新建文件 QCameraOutput.cpp:
#include "QCameraOutput.h"
QCameraOutput::QCameraOutput()
{
}
QCameraOutput::~QCameraOutput()
{
}
3)新建 camera.h,在该文件中实现 Camera 的功能:
#include <QObject>
#include <QtMultimedia>
#include <QStringList>
#include "QCameraOutput.h"
class Camera : public QObject
{
Q_OBJECT
public:
Camera(QObject *parent = 0);
~Camera();
Q_INVOKABLE void captureImage(); //实现照相功能
Q_INVOKABLE void start(); //启动摄像头
Q_INVOKABLE void setCaptureMode(); //设置摄像头的模式转换,照相机<->摄像机
//返回一个QCamera指针,以供QML中的取景器调用,以显示画面
Q_INVOKABLE QCameraOutput *get_cameraOutput();
private:
QCameraOutput *m_camera;
QCameraImageCapture *m_imageCapture;
}
4)新建 camera.cpp,并实现 camera.h 中的功能:
#include <QGuiApplication>
#include <QQuickView>
#include <QMetaObject>
#include <QDebug>
#include <QUrlQuery>
#include "camera.h"
Camera::Camera(QObject *parent)
{
Q_UNUSED(parent);
m_camera = new QCameraOutput;
m_imageCapture=new QCameraImageCapture(m_camera);
}
Camera::~Camera()
{
delete m_camera;
delete m_imageCapture;
}
void Camera::captureImage()
{
m_imageCapture->capture();
}
void Camera::start()
{
m_camera->start();
}
void Camera::setCaptureMode()
{
if(m_camera->captureMode() == QCameraOutput::CaptureStillImage)
{
m_camera->setCaptureMode(QCameraOutput::CaptureVideo);
}else
{
m_camera->setCaptureMode(QCameraOutput::CaptureStillImage);
}
}
QCameraOutput* Camera::get_cameraOutput()
{
return m_camera;
}
5)将 Camera 与 QCameraOutput 暴露给 QML,一个实现 camera 功能,一个供取景器调用:
m_camera = new Camera;
QCameraOutput *cameraOutput = m_camera->get_cameraOutput();
//提供给取景器
m_view->rootContext()->setContextProperty("cameraOutput", cameraOutput);
//实现camera功能
m_view->rootContext()->setContextProperty("camera", m_camera);
6)在 QML 中调用"cameraOutput"以及"camera":
VideoOutput {
anchors.fill: parent
source: cameraOutput
fillMode: VideoOutput.PreserveAspectFit
}
camera.start()
camera.captureImage()
camera.setCaptureMode()
...
上述例子中只实现了最基础的调用 camera 以及实现照相功能,切换照相/摄像功能,其更多对 Qcmera,参见 qt 官网对QCamera。