ffmpeg播放器6(从2-5的实现)-下

162 阅读3分钟

1 背景

本文是上一篇的继续,上一篇只写了ffmpeg播放器2,这一篇计划写到播放器5,中间的可能会跳过,目标是先实现一个Demo,再在这个基础上继续完善。

2 从播放器开始

上一篇mainwindow.cpp结尾到如下代码

void MainWindow::OpenMediaDlg(int index)
{
    HOpenMediaDlg dlg(this);
    if(dlg.exec()==QDialog::Accepted){
        std::cout<<dlg.media.src<<std::endl;
    }
}

接下来 ffmpeg播放器2 中是通过如下来实现的

center->mv->play(dlg.media);

2.1 mv 对象

这里简单mv 前面也分析是了是 HMultiView (QWidget),按上一篇的规则新建一个(PS,目前基本上都是Qt Widgets Designer Form Class)

可能重要的 image.png

image.png

在HMultiView中添加一个play的槽

#include "hmedia.h"

public slots:
    void play(HMedia& media);

image.png

选中,右键,重构,添加定义

image.png

然后双击 mainwindow.ui,在中间(centralwidget)下,添加一个 widget

image.png

修改对象名为mv,方便好找

image.png

选中刚才的mv,然后右键 提升为HMultiView

image.png

输入头文件名HMultiView,然后点添加 image.png

这里选中,点提升 image.png

最终的效果如下

image.png

在mainwindow.cpp中调用刚才的mv(别人的代码有层级,这个用ui可以直接调到)

void MainWindow::OpenMediaDlg(int index)
{
    HOpenMediaDlg dlg(this);
    if(dlg.exec()==QDialog::Accepted){
        ui->mv->play(dlg.media);
    }
}

PS:如果没mv,可以先编译下,如果还没有,检查前面是不是改了mv的名字。play前面有添加槽。

在hmultiview.cpp中的play追加如下代码

void HMultiView::play(HMedia &media)
{
    std::cout<<media.src<<std::endl;
}

上面的打断点,运行到这里(文件-打开,选择 媒体文件,点确定)

image.png

2.2 HMultiView 中的 player (HVideoWidget)

这里就不创建多个player,先添加一个争取跑完,回头再优化

继续创建一个HVideoWidget(基于QFrame)(PS,目前基本上都是Qt Widgets Designer Form Class)

image.png

第二步名称为HVideoWidget

然后在hvideowidget.h添加一个私有槽play,一个对象media,如下

public slots:
    void open(HMedia& media);

private:
    HMedia media;

image.png

添加open的定义,选中,右键,重构,添加定义

image.png

然后添加如下代码

void HVideoWidget::open(HMedia &media)
{
    this->media=media;
}

再双击hmultiview.ui,添加一个Frame

image.png

参考前面的提升,追加HVideoWidget,并将Frame提升为HVideoWidget

image.png

修改对象名称为player,方便调用

image.png

保存,编译,然后在hmultiview.cpp中调用

void HMultiView::play(HMedia &media)
{
    ui->player->open(media);
}

在hvideowidget.cpp中添加断点

image.png

运行能跳到这里

image.png

2.3 HVideoWidget 中的 start

参考 ffmpeg播放器3 在open之后,除了复制 media,还执行了start槽

在hvideowidget.h中添加如下代码

public slots:
    void open(HMedia& media);
    void start();    

添加start的定义,选中,右键,重构,添加定义

image.png

再在上面的open定义里调用

void HVideoWidget::open(HMedia &media)
{
    this->media=media;
    start();
}

void HVideoWidget::start()
{

}

ffmpeg播放器3 中提到了 start里的 pImpl_player 声明是HVideoPlayer,这里再添加一个HVideoPlayer的文件

image.png

image.png

双击hvideowidget.h,添加声明

#include "hvideoplayer.h"

private:
    HMedia media;
    HVideoPlayer* pImpl_player;

image.png

2.4 pImpl_player

从 ffmpeg播放器3 知道 pImpl_player 是使用工厂方法创建的 HFFPlayer,这里直接跳过,使用工厂方法的内容直接创建

先添加一个HFFPlayer的文件,继承HVideoPlayer

image.png

在hvideowidget.cpp中的start中可以实例化pImpl_player了

#include "hffplayer.h"

void HVideoWidget::start()
{
   pImpl_player=new HFFPlayer();
}

再在hvideoplayer.h添加如下代码

#include "hmedia.h"

public:
    void set_media(HMedia& media);
public:
    HMedia media;

添加set_media的定义,选中,右键,重构,添加定义

void HVideoPlayer::set_media(HMedia &media)
{
    this->media=media;
}

image.png

然后就能在hvideowidget.cpp中使用set_media了,如下代码所示

void HVideoWidget::start()
{
    this->pImpl_player=new HFFPlayer();
    this->pImpl_player->set_media(this->media);
}

2.5 还是要添加线程,不添加线程,好像没法播放---未完待续