第14章 Qt项目实战之视频播放器


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

第14章 Qt项目实战之视频播放器

福优学苑@视频加密专家

  视频加密 -- 操作说明

HiTT -- 福优学苑音视频加密专家,经典的C/S架构,分为服务端和客户端。

服务端负责对视频文件进行加密,客户端主要负责播放视频(边解密边播放)。

第1步:选择音视频文件

第2步:加密设置(密码设置、加密模式、一机一码、共享模式、绑定硬盘主板显卡)

第3步:播放设置(次数限制、预览限制、时间限制、播放比例、视频水印设置)

第4步:防盗设置(防止录屏、禁止截屏、禁止虚拟机播放、防盗问答)

第5步:输出设置(输出文件夹)

播放器:一机一码,边解密边播放,保护视频版权

image.png

image.png

好文章,来自【福优学苑@音视频+流媒体】

image.png

好文章,来自【福优学苑@音视频+流媒体】



Qt视频播放器

Qt对音视频的播放和控制、相机拍摄、收音机等多媒体应用提供了强大的支持。

Qt5使用了全新的Qt Multimedia模块来实现多媒体应用,Qt4中用来实现多媒体功能的Phonon模块已经被移除。

新的Qt Multimedia模块提供了丰富的接口,可以轻松地使用平台的多媒体功能。例如进行媒体播放、使用相机和收音机等。


image.png

好文章,来自【福优学苑@音视频+流媒体】


QMediaPlayer简介

QMediaPlayer播放视频要在界面上显示出来,还需要其他类进行辅助,比如QVideoWidget类。

QVideoWidget继承自QWidget,所有它可以作为一个普通窗口部件进行显示,也可以嵌入到其他窗口。

将QVideoWidget指定为QMediaPlayer的视频输出窗口后,就可以显示播放的视频画面。

player = new QMediaPlayer;

videoWidget = new QVideoWidget;

player->setVideoOutput(videoWidget);

videoWidget->show();

player->play();

image.png

好文章,来自【福优学苑@音视频+流媒体】


QVideoWidget简介

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

player = new QMediaPlayer;

videoWidget = new QVideoWidget;

player->setVideoOutput(videoWidget);

videoWidget->show();

player->play();


QVideoWidget属性


名称 类型 说明

名称

类型

说明

aspectRatioMode

Qt::AspectRatioMode

显示比率

brightness

int

亮度

contrast

int

对比度

fullScreen

bool

是否全屏

hue

int

色调

mediaObject

QMediaObject *const

视频媒体对象

saturation

int

饱和度

好文章,来自【福优学苑@音视频+流媒体】


error: C1083:

问题:qt creator报错 error: C1083: 无法打开包括文件:“QMediaPlayer”

解决QT      += multimedia  multimediawidgets



如何获取duration


QT关于QMediaplayer 的duration()获取的音视频时间长度为0的问题。

  在QT中,使用QMediaplayer类可以很方便地实现视频的播放,而在QMediaplayer类中有个duration函数可以直接获取所打开视频的总时间长度。

但使用后你会发现duration()返回的居然是个0。

  官方解释:

The value may change across the life time of the QMediaPlayer object and may not be available when initial playback begins, connect to the durationChanged() signal to receive status notifications.

在初始回放开始时可能不可用,请连接durationChanged()信号以接收状态通知。

即我们只需要写个槽函数,在槽函数里面调用duration()就可以接收到正确的时间

例:


//第一步:连接槽函数,信号为QMediaPlayer自带的durationChanged,槽就是自己定义的getduration,注意参数类型要一致

QObject::connect(player,

  SIGNAL(durationChanged(qint64)),

  this,

  SLOT(getduration(qint64)));


//第二步:写槽函数,mediaplay为类名,不同类需要修改这个类名,playtime为总时长

void Widget::getduration(qint64 playtime)

{

// 在这里获取duration(...)

    playtime = player->duration();

}

经过以上两步就可以获得正确的时间啦。

好文章,来自【福优学苑@音视频+流媒体】

以下再附上把获得的时间转化为时分秒的函数:

QString Widget::convertMillisecToString(qint64 millisec)

{

    int h,m,s;

    millisec /= 1000;  //获得的时间是以毫秒为单位的

    h = (int)millisec / 3600;

    m = ((int)millisec - h*3600)/60;

    s = (int)millisec - h*3600 - m*60;

    //把int型转化为string类型

    QString strFormat = QString("%1:%2:%3")

                            .arg(h,2,10,QChar('0'))

                            .arg(m,2,10,QChar('0'))

                            .arg(s,2,10,QChar('0'));

    return strFormat;

}



双击全屏显示

事件过滤器

双击标签VideoWidget,进入全屏


//事件过滤器:(双击:全屏)

bool Widget::eventFilter(QObject *obj, QEvent *event)

{

    if (obj == ui->label_Video)//指定某个QLabel

    {

        //  QEvent::MouseButtonPress,QEvent::MouseButtonDblClick

        if (event->type() == QEvent::MouseButtonDblClick)

        {

            QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);

            if(mouseEvent->button() == Qt::LeftButton)

            {

                if(!this->isFullScreen()){

                    this->showFullScreen();

                }

                else{

                    this->showNormal();

                }

                return true;

            }

            else

            {

                return false;

            }

        }

        else

        {

            return false;

        }

    }

    else

    {

        // pass the event on to the parent class

        return Widget::eventFilter(obj, event);

    }

}

好文章,来自【福优学苑@音视频+流媒体】

按esc退出全屏

// 处理键盘--按键:按esc退出全屏

void Widget::keyPressEvent(QKeyEvent *event)

{

   switch(event->key())

   {

     case Qt::Key_Escape:

       if(this->isFullScreen()){

           this->showNormal();

       }

       break;

    default:

       QWidget::keyPressEvent(event);

   }

}

好文章,来自【福优学苑@音视频+流媒体】

播放/暂停/停止/随机进度


void Widget::on_pushButton_PlayPause_clicked()

{

    if(m_player->state() == QMediaPlayer::PlayingState){

        m_player->pause();

        ui->pushButton_PlayPause->setText("播放");

    }

    else if(m_player->state() == QMediaPlayer::PausedState){

        m_player->play();

        ui->pushButton_PlayPause->setText("暂停");

    }

}


void Widget::on_pushButton_Stop_clicked()

{

    //QMediaPlayer::PlayingState

    m_player->stop();

    ui->label_Current->setText("00:00:00");

    ui->label_Duration->setText("00:00:00");

    ui->horizontalSlider_progress->setValue(0);

    // 按钮状态

    ui->pushButton_PlayPause->setEnabled(false);

    ui->pushButton_Stop->setEnabled(false);

    ui->pushButton_OpenFile->setEnabled(true);

    ui->horizontalSlider_progress->setEnabled(false);

}

好文章,来自【福优学苑@音视频+流媒体】

void Widget::on_horizontalSlider_progress_valueChanged(int value)

{

    m_player->setPosition(value);

}








好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***