查看完整版本: [-- QT5杂谈(四)------Qt5中利用mplayer播放视频 --]

QTCN开发网 -> Qt代码秀 -> QT5杂谈(四)------Qt5中利用mplayer播放视频 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

青春岁月 2014-04-28 11:33

QT5杂谈(四)------Qt5中利用mplayer播放视频

Qt5中利用mplayer播放视频,可以暂停,重播,上一个,下一个,循环播放!
showvideo.cpp
  1. #include "showvideo.h"

    ShowVideo::ShowVideo(QWidget *parent,QListWidgetItem *item,QListWidget *list,QString path) :
        QDialog(parent)
    {
        //初始化窗口
        this->resize(1024,768);
        this->move(0,0);
        this->setStyleSheet(tr("background-color: rgba(255,255,255,100%)"));
        this->setWindowFlags(Qt::FramelessWindowHint);

        //初始化状态信息
        isFinish = false;
        isPause = false;


        //当前路径
        currentPath = path;

        //初始化图片数据
        showList = list;
        rowNum = showList->currentRow();
        rowCount = showList->count();
        currentItem = item;

        //文件名
        nameLabel = new QLabel(this);
        nameLabel->move(60,720);
        nameLabel->setText(currentItem->text());

        //显示图像的QLabel
        videoLabel = new QLabel(this);
        videoLabel->setStyleSheet("background-color: rgb(0,0,0)");
        videoLabel->move(10,10);
        videoLabel->resize(1004,678);


        //初始化进度条
        bar = new QProgressBar(this);
        bar->move(10,688);
        bar->resize(1004,15);
        bar->setMinimum(0);
        bar->setMaximum(99);
        bar->setTextVisible(true);
        bar->setValue(0);

        //设置return按钮属性
        retBtn = new QPushButton(this);
        retBtn->setIconSize(QSize(32,32));
        retBtn->setIcon(QIcon(tr(":/images/return.ico")));
        retBtn->resize(32,32);
        retBtn->setStyleSheet(tr("border-radius:10px;"));
        retBtn->setFocusPolicy(Qt::NoFocus);
        retBtn->move(984,715);
        connect(retBtn,SIGNAL(clicked()),this,SLOT(closeShowVideo()));


        //设置player\pause按钮属性
        startBtn = new QPushButton(this);
        startBtn->setIconSize(QSize(32,32));
        startBtn->setIcon(QIcon(tr(":/images/pause.ico")));
        startBtn->resize(32,32);
        startBtn->setStyleSheet("border-radius:10px;");
        startBtn->setFocusPolicy(Qt::NoFocus);
        startBtn->move(495,715);
        connect(startBtn,SIGNAL(clicked()),this,SLOT(start_pauseVideo()));

        //上一个视频按钮属性
        forwardBtn = new QPushButton(this);
        forwardBtn->setIconSize(QSize(32,32));
        forwardBtn->setIcon(QIcon(tr(":/images/forward.ico")));
        forwardBtn->resize(32,32);
        forwardBtn->setStyleSheet(tr("background-color: rgba(50%,50%,50%,0%);border-radius:10px;"));
        forwardBtn->setFocusPolicy(Qt::NoFocus);
        forwardBtn->move(440,715);
        connect(forwardBtn,SIGNAL(clicked()),this,SLOT(forwardVideo()));

        //下一个视频按钮属性
        nextBtn = new QPushButton(this);
        nextBtn->setIconSize(QSize(32,32));
        nextBtn->setIcon(QIcon(tr(":/images/next.ico")));
        nextBtn->resize(32,32);
        nextBtn->setStyleSheet(tr("background-color: rgba(50%,50%,50%,0%);border-radius:10px;"));
        nextBtn->setFocusPolicy(Qt::NoFocus);
        nextBtn->move(550,715);
        connect(nextBtn,SIGNAL(clicked()),this,SLOT(nextVideo()));

        //删除图片按钮属性
        deleteBtn = new QPushButton(this);
        deleteBtn->setIconSize(QSize(32,32));
        deleteBtn->setIcon(QIcon(tr(":/images/delete.ico")));
        deleteBtn->resize(32,32);
        deleteBtn->setStyleSheet(tr("background-color: rgba(50%,50%,50%,0%);border-radius:10px;"));
        deleteBtn->setFocusPolicy(Qt::NoFocus);
        deleteBtn->move(20,715);
        connect(deleteBtn,SIGNAL(clicked()),this,SLOT(deleteVideo()));

        //初始化进程
        play_process = new QProcess(this);
        play_process->setProcessChannelMode(QProcess::MergedChannels);
        connect(play_process,SIGNAL(readyReadStandardOutput()),this,SLOT(getVideoInfo()));


        //定时获取播放进度
        timer = new QTimer(this);
        connect(timer,SIGNAL(timeout()),this,SLOT(sendPosCmd()));

        playVideo(currentPath + currentItem->text());
    }

    //获取视频信息
    void ShowVideo::getVideoInfo()
    {
        while(play_process->canReadLine())
        {
            QString message(play_process->readLine());
            if(message.left(21) == tr("ANS_PERCENT_POSITION="))
            {
                bar->setValue(message.remove(0,21).toInt(NULL,10));
            }
            //message即为读取的信息我们可以根据需要取我们要的信息如
            //文件总时间为:ANS_LENGTH=23.00
            //当前时间为:ANS_TIME_POSITION=23.00
        }
    }

    //播放视频
    void ShowVideo::playVideo(QString fileName)
    {
        QString str;
        str = tr("mplayer -slave -quiet -fps 15 ");
        str.append(fileName);
        str.append(tr(" -wid "));
        str.append(QString::number(videoLabel->winId()));
        play_process->start(str,QIODevice::ReadWrite);
        connect(play_process,SIGNAL(finished(int)),this,SLOT(getFinishStatus(int)));
        timer->start(30);
        nameLabel->setText(fileName.right(16));
        isFinish = false;
    }


    //获取播放进度百分比的命令
    void ShowVideo::sendPosCmd()
    {
        play_process->write("get_percent_pos\n");
    }

    //获取播放完成的状态
    void ShowVideo::getFinishStatus(int status)
    {
        if(status == 0)
        {
            bar->setValue(0);
            timer->stop();
            play_process->close();

            isFinish = true;
            startBtn->setIcon(QIcon(tr(":/images/start.ico")));
            isPause = true;
        }
    }

    //开始\暂停\重播 播放
    void ShowVideo::start_pauseVideo()
    {
        if(isPause == false)
        {
            timer->stop();
            startBtn->setIcon(QIcon(tr(":/images/start.ico")));
            isPause = true;
            play_process->write("pause\n");

        }else
        {
            startBtn->setIcon(QIcon(tr(":/images/pause.ico")));
            isPause = false;

            if(!isFinish)
            {
                timer->start(30);
                play_process->write("pause\n");

            }else
            {
                this->playVideo(currentPath + showList->item(rowNum)->text());
            }
        }
    }


    //播放上一个视频
    void ShowVideo::forwardVideo()
    {
        QListWidgetItem *item;

        bar->setValue(0);
        timer->stop();
        play_process->close();

        startBtn->setIcon(QIcon(tr(":/images/pause.ico")));
        isPause = false;

        if(rowNum == 0)
        {
            rowNum = rowCount - 1;
            item = showList->item(rowNum);
            this->playVideo(currentPath + item->text());
            return;
        }

        rowNum--;

        item = showList->item(rowNum);
        this->playVideo(currentPath + item->text());
        return;
    }

    //播放下一个视频
    void ShowVideo::nextVideo()
    {
        QListWidgetItem *item;

        bar->setValue(0);
        timer->stop();
        play_process->close();

        startBtn->setIcon(QIcon(tr(":/images/pause.ico")));
        isPause = false;

        if(rowNum == rowCount - 1)
        {
            rowNum = 0;
            item = showList->item(rowNum);
            this->playVideo(currentPath + item->text());

            return;
        }

        rowNum++;

        item = showList->item(rowNum);
        this->playVideo(currentPath + item->text());
    }


    //删除视频文件
    void ShowVideo::deleteVideo()
    {
        int ret;
        QListWidgetItem *item;

        ret = QMessageBox::warning(this,NULL,
                                   tr("是否删除").append(showList->item(rowNum)->text()).append(tr("?")),
                                   QMessageBox::Yes | QMessageBox::No);
        if(ret == QMessageBox::Yes)
        {
            QFile::remove(currentPath + showList->item(rowNum)->text());
            showList->removeItemWidget(showList->item(rowNum));

            //删除item
            item = showList->takeItem(rowNum);
            showList->removeItemWidget(item);
            delete item;

            rowCount--;

            if(rowCount == 0)
            {
                bar->setValue(0);
                timer->stop();
                play_process->close();

                startBtn->setIcon(QIcon(tr(":/images/start.ico")));
                isPause = true;

                videoLabel->setStyleSheet(tr("background-color: rgba(255,255,255,255)"));

                nameLabel->setText("");

                return;
            }

            if(rowNum == rowCount)
            {
                rowNum = rowCount - 1;
            }

            item = showList->item(rowNum);

            bar->setValue(0);
            timer->stop();
            play_process->close();

            startBtn->setIcon(QIcon(tr(":/images/pause.ico")));
            isPause = false;
            playVideo(currentPath + item->text());
        }
    }
    //返回上一级
    void ShowVideo::closeShowVideo()
    {
        timer->stop();
        play_process->close();
        emit quitApp();
        this->close();
    }



自强不吸 2014-05-06 11:33
楼主上个效果图瞅瞅啊

玩意儿 2014-11-03 14:56
我想问一下怎样双击视频文件时自动打开视频播放程序并播放???

slf0205 2014-11-05 14:24

bb1994525 2014-11-15 21:19
最近在学习视频播放器,楼主能不能把这个文件的完整工程上传一下?交流学习?或者发我邮箱也可: bb1994525@126.com  希望您能及时看到,谢谢!


查看完整版本: [-- QT5杂谈(四)------Qt5中利用mplayer播放视频 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled