[QT_052]Qt视频播放相关类说明(QMediaPlayer、QMediaPlaylist、QVideoWidget)

本文转自:https://blog.csdn.net/zhaoyun_zzz/article/details/90290552

1.QMediaPlayer相关说明

QMediaPlayer类的player播放状态:State

状态枚举名称枚举值说明
StoppedState0播放停止状态
PlayingState1播放状态
PausedState2播放暂停状态

QMediaPlayer类的媒体状态:MediaStatus

状态枚举名称枚举值说明
UnknownMediaStatus0未知状态
NoMedia1无媒体文件,player处于StoppedState
LoadingMedia2媒体文件加载中,player可以处于任何状态
LoadedMedia3媒体文件已加载,player处于StoppedState
StalledMedia4媒体处于延迟或者暂时的中断状态,palyer处于 PlayingState或者PausedState
BufferingMedia5媒体正在缓冲数据,palyer处于 PlayingState或者PausedState
BufferedMedia6媒体缓冲数据完成,palyer处于 PlayingState或者PausedState
EndOfMedia7媒体结束,player处于StoppedState
InvalidMedia8非法的媒体文件,player处于StoppedState

QMediaPlayer类的player播放标志位:Flags

状态枚举名称枚举值说明
LowLatency1播放未压缩的音频数据,播放表现为低延时,主要播放beeps, ringtones等
StreamPlayback2播放基于 QIODevice构建的媒体文件,QMediaPlayer或自动选择支持的流进行播放
VideoSurface4渲染视频到QAbstractVideoSurface output

QMediaPlayer类的player错误标志位:Error

状态枚举名称枚举值说明
NoError0无错误
ResourceError1媒体源错误
FormatError2格式错误,播放可能会丢失音频或者视频
NetworkError3网络错误
AccessDeniedError4访问权限错误
ServiceMissingError5服务丢失错误

QMediaPlayer类的属性:

属性名称取值类型说明访问函数
audioAvailableconst bool音频是否可用,audioAvailableChanged信号函数用于监控其状态bool isAudioAvailable() const
audioRoleQAudio::Role音频流播放roleQAudio::Role audioRole() const,void setAudioRole(QAudio::Role audioRole)
bufferStatusconst int缓冲数据的百分比,在开始播放或者回复播放之前int bufferStatus() const, void bufferStatusChanged(int percentFilled)
currentMediaconst QMediaContent当前激活的媒体,在使用Playlist时,可能与mdia属性不同QMediaContent currentMedia() const, void currentMediaChanged(const QMediaContent &media)
durationconst qint64currentMedia的播放时长,单位msqint64 duration() const, void durationChanged(qint64 duration)
mediaQMediaContent激活的并被使用的媒体源QMediaContent media() const, void setMedia(const QMediaContent &media, QIODevice *stream = nullptr), void mediaChanged(const QMediaContent &media)
playbackRateqreal当前媒体的播放速度,默认为1.0qreal playbackRate() const, void setPlaybackRate(qreal rate), void playbackRateChanged(qreal rate)
playlistQMediaPlaylist*播放列表QMediaPlaylist * playlist() const, void setPlaylist(QMediaPlaylist *playlist),
volumeint音量,取值范围0—100int volume() const, void setVolume(int volume), void volumeChanged(int volume

播放音频步骤

player = new QMediaPlayer;
connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));
player->setMedia(QUrl::fromLocalFile("./Music/test.mp3"));
player->setVolume(50);
player->play();

播放视频频步骤

QMediaPlayer要播放视频需要使用辅助类QVideoWidgetQGraphicsVideoItem,将辅助类对象设置为QMediaPlayer的视频输出窗口,就可以播放视频。

playlist = new QMediaPlaylist;
playlist->addMedia(QUrl("movie1.mp4"));
playlist->addMedia(QUrl("movie2.mp4"));
playlist->addMedia(QUrl("movie3.mp4"));
playlist->setCurrentIndex(1);

player = new QMediaPlayer;
player->setPlaylist(playlist);

videoWidget = new QVideoWidget;
player->setVideoOutput(videoWidget);
videoWidget->show();

player->play();

2.QMediaPlaylist相关说明

QMediaPlaylist类,可以为QMediaPlayer提供一个播放列表,它其实是QMediaContent对象的列表。QMediaPlayer通过函数setPlayList来设置一个播放列表QMediaPlaylist;通过函数addMedia播放列表添加一个媒体文件。QMediaPlaylist类的播放模式:PlaybackMode

状态枚举名称枚举值说明
CurrentItemOnce0当前选中的媒体文件仅播放一次
CurrentItemInLoop1当前选中的媒体文件循环播放
Sequential2从当前选中的媒体文件开始,列表中的文件顺序播放一次直到最后一个文件
Loop3列表中的文件顺序循环播放
Random4列表中的文件随机播放

QMediaPlaylist属性:

名称类型说明
currentIndexint当前播放的媒体文件在列表中的索引
currentMediaconst QMediaContent当前选中的媒体文件
palybackModeQMediaPlaylist::PlaybackMode从当前选中的媒体文件开始,列表中的文件顺序播放一次直到最后一个文件

QMediaPlaylist函数:

返回值类型函数名称描述说明
booladdMedia(const QMediaContent &content)Public Functions,列表添加单个媒体文件
booladdMedia(const QList &items)Public Functions,列表添加多个媒体文件
intcurrentIndex() const获得当前播放媒体的索引
QMediaContentcurrentMedia() const获得当前播放的媒体文件
QMediaPlaylist::Errorerror() const列表错误状态
QStringerrorString() const播放列表错误字符串信息
boolinsertMedia(int pos, const QMediaContent &content)向播放列表插入一个媒体文件
boolinsertMedia(int pos, const QList &items)向播放列表插入多个媒体文件
boolisEmpty() const清空列表
boolisReadOnly() const清空列表
voidload(const QNetworkRequest &request, const char *format = nullptr)加载网络媒体
voidload(const QUrl &location, const char *format = nullptr)加载本地媒体文件
voidload(QIODevice *device, const char *format = nullptr)加载IO设备文件
QMediaContentmedia(int index) const获得指定索引的媒体文件
intmediaCount() const统计播放列表的文件数量
boolmoveMedia(int from, int to)根据位置参数移动媒体文件
intnextIndex(int steps = 1) const当前播放文件的下一个文件索引
PlaybackModeplaybackMode() const获取列表播放模式
intpreviousIndex(int steps = 1) const当前播放文件的上一个文件索引
boolremoveMedia(int pos)删除列表中指定位置的文件
boolremoveMedia(int start, int end)删除列表中start到end之间的文件
boolsave(const QUrl &location, const char *format = nullptr)保存列表QUrl 指定位置
boolsave(QIODevice *device, const char *format)保存列表到IO设备
voidsetPlaybackMode(QMediaPlaylist::PlaybackMode mode)设置列表播放模式

QMediaPlaylist槽:

返回值类型函数名称描述说明
voidnext()下一个文件
voidprevious()上一个文件
voidsetCurrentIndex(int playlistPosition)设置当前播放媒体的索引
voidshuffle()媒体顺序洗牌,重建媒体的索引

QMediaPlaylist信号:

返回值类型函数名称描述说明
voidcurrentIndexChanged(int position)当前索引改变信号
voidcurrentMediaChanged(const QMediaContent &content)当前媒体文件改变信号
voidloadFailed()加载失败信号
voidloaded()加载完成信号
voidmediaAboutToBeInserted(int start, int end)媒体即将被插入信号
voidmediaAboutToBeRemoved(int start, int end)媒体即将被删除信号
voidmediaChanged(int start, int end)媒体文件改变信号
voidmediaInserted(int start, int end)媒体文件插入信号
voidmediaRemoved(int start, int end)媒体文件删除信号
voidplaybackModeChanged(QMediaPlaylist::PlaybackMode mode)列表播放模式改变信号

3.QVideoWidget相关说明

QVideoWidget是一个用来展示视频的类,需要先定义一个QMediaPlayer对象,然后将QMediaPlayerVideoOutput设置为QVideoWidget对象即可。
QVideoWidget属性:

名称类型说明
aspectRatioMode :Qt::AspectRatioMode屏幕高宽比
brightnessint亮度
contrastint对比度
fullScreenbool是否全屏
hueint色调
mediaObjectQMediaObject* const视频媒体对象
saturationint饱和度

QVideoWidget函数:

返回值类型函数名称描述说明
Qt::AspectRatioModeaspectRatioMode() const获取视频画面宽高比
intsaturation() const获取饱和度
intbrightness() const获取亮度
intcontrast() const获取对比度
inthue() const获取色调
boolisFullScreen() const获取全屏状态

QVideoWidget槽:

返回值类型函数名称描述说明
voidsetAspectRatioMode(Qt::AspectRatioMode mode)设置宽高比
voidsetBrightness(int brightness)设置亮度
voidsetContrast(int contrast)设置对比度
voidsetFullScreen(bool fullScreen)设置全屏状态
voidsetHue(int hue)设置色调
voidsetSaturation(int saturation)设置饱和度

QMediaPlaylist信号:

返回值类型函数名称描述说明
voidbrightnessChanged(int brightness)亮度改变信号
voidcontrastChanged(int contrast)对比度改变信号
voidfullScreenChanged(bool fullScreen)全屏状态信号
voidhueChanged(int hue)色调改变信号
voidsaturationChanged(int saturation)饱和度改变信号

完整示例代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
class QMediaPlaylist;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_horizontalSlider_sliderMoved(int position);

private:
    Ui::MainWindow *ui;
    QMediaPlayer *player;

    QMediaPlaylist *playlist;

private slots:
    void updatePosition(qint64 position);

    void stateChanged(QMediaPlayer::State state);
    void mediaStatusChanged(QMediaPlayer::MediaStatus status);
    void showError(QMediaPlayer::Error error);

    void metaDataAvailableChanged(bool available);
};

#endif // MAINWINDOW_H

mainwindow.cpp

// mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMediaPlaylist>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    player = new QMediaPlayer(this);
    connect(player, &QMediaPlayer::positionChanged,
            this, &MainWindow::updatePosition);

    connect(player, &QMediaPlayer::stateChanged, this, &MainWindow::stateChanged);
    connect(player, &QMediaPlayer::mediaStatusChanged,
            this, &MainWindow::mediaStatusChanged);
    connect(player, static_cast<void(QMediaPlayer::*)(QMediaPlayer::Error)>
            (&QMediaPlayer::error), this, &MainWindow::showError);

    connect(player, &QMediaPlayer::metaDataAvailableChanged,
            this, &MainWindow::metaDataAvailableChanged);


    playlist = new QMediaPlaylist;
    playlist->addMedia(QUrl::fromLocalFile("/home/luke/Music/music.mp3"));
    playlist->addMedia(QUrl::fromLocalFile("/home/luke/Music/music2.mp3"));
    playlist->addMedia(QUrl::fromLocalFile("/home/luke/Music/music3.mp3"));
    playlist->setCurrentIndex(0);
    playlist->setPlaybackMode(QMediaPlaylist::Loop);
    player->setPlaylist(playlist);
}


MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{ // 播放
    player->play();
}

void MainWindow::on_pushButton_2_clicked()
{ // 暂停
    player->pause();
}

void MainWindow::on_pushButton_3_clicked()
{ // 停止
    player->stop();
}


void MainWindow::on_horizontalSlider_sliderMoved(int position)
{ // 设置播放进度
    player->setPosition(position * 1000);
}

void MainWindow::updatePosition(qint64 position)
{ // 更新滑块显示
    ui->horizontalSlider->setMaximum(player->duration() / 1000);
    ui->horizontalSlider->setValue(position / 1000);
}

void MainWindow::mediaStatusChanged(QMediaPlayer::MediaStatus status)
{
    switch (status) {
    case QMediaPlayer::UnknownMediaStatus:
        ui->label->setText(tr("媒体未知状况!"));
        break;
    case QMediaPlayer::NoMedia:
        ui->label->setText(tr("没有媒体文件!"));
        break;
    case QMediaPlayer::BufferingMedia:
        ui->label->setText(tr("正在缓冲媒体文件!"));
        break;
    case QMediaPlayer::BufferedMedia:
        ui->label->setText(tr("媒体文件缓冲完成!"));
        break;
    case QMediaPlayer::LoadingMedia:
        ui->label->setText(tr("正在加载媒体!"));
        break;
    case QMediaPlayer::StalledMedia:
        ui->label->setText(tr("播放停滞!"));
        break;
    case QMediaPlayer::EndOfMedia:
        ui->label->setText(tr("播放结束!"));
        break;
    case QMediaPlayer::LoadedMedia:
        ui->label->setText(tr("媒体加载完成!"));
        break;
    case QMediaPlayer::InvalidMedia:
        ui->label->setText(tr("不可用的媒体文件!"));
        break;
    default: break;
    }
}

void MainWindow::stateChanged(QMediaPlayer::State state)
{
    switch (state) {
    case QMediaPlayer::StoppedState:
        ui->label_2->setText(tr("停止状态!"));
        break;
    case QMediaPlayer::PlayingState:
        ui->label_2->setText(tr("播放状态!"));
        break;
    case QMediaPlayer::PausedState:
        ui->label_2->setText(tr("暂停状态!"));
        break;
    default: break;
    }
}

void MainWindow::showError(QMediaPlayer::Error error)
{
    switch (error) {
    case QMediaPlayer::NoError:
        ui->label_3->setText(tr("没有错误!"));
        break;
    case QMediaPlayer::ResourceError:
        ui->label_3->setText(tr("媒体资源无法被解析!"));
        break;
    case QMediaPlayer::FormatError:
        ui->label_3->setText(tr("不支持该媒体格式!"));
        break;
    case QMediaPlayer::NetworkError:
        ui->label_3->setText(tr("发生了一个网络错误!"));
        break;
    case QMediaPlayer::AccessDeniedError:
        ui->label_3->setText(tr("没有播放权限!"));
        break;
    case QMediaPlayer::ServiceMissingError:
        ui->label_3->setText(tr("没有发现有效的播放服务!"));
        break;
    default: break;
    }
}

// 获取元数据
void MainWindow::metaDataAvailableChanged(bool available)
{
    if(available) {
        QString title = player->metaData("Title").toString();
        QString author = player->metaData("Author").toString();
        setWindowTitle(title + "-" + author);
    }
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值