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)
可能重要的
在HMultiView中添加一个play的槽
#include "hmedia.h"
public slots:
void play(HMedia& media);
选中,右键,重构,添加定义
然后双击 mainwindow.ui,在中间(centralwidget)下,添加一个 widget
修改对象名为mv,方便好找
选中刚才的mv,然后右键 提升为HMultiView
输入头文件名HMultiView,然后点添加
这里选中,点提升
最终的效果如下
在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;
}
上面的打断点,运行到这里(文件-打开,选择 媒体文件,点确定)
2.2 HMultiView 中的 player (HVideoWidget)
这里就不创建多个player,先添加一个争取跑完,回头再优化
继续创建一个HVideoWidget(基于QFrame)(PS,目前基本上都是Qt Widgets Designer Form Class)
第二步名称为HVideoWidget
然后在hvideowidget.h添加一个私有槽play,一个对象media,如下
public slots:
void open(HMedia& media);
private:
HMedia media;
添加open的定义,选中,右键,重构,添加定义
然后添加如下代码
void HVideoWidget::open(HMedia &media)
{
this->media=media;
}
再双击hmultiview.ui,添加一个Frame
参考前面的提升,追加HVideoWidget,并将Frame提升为HVideoWidget
修改对象名称为player,方便调用
保存,编译,然后在hmultiview.cpp中调用
void HMultiView::play(HMedia &media)
{
ui->player->open(media);
}
在hvideowidget.cpp中添加断点
运行能跳到这里
2.3 HVideoWidget 中的 start
参考 ffmpeg播放器3 在open之后,除了复制 media,还执行了start槽
在hvideowidget.h中添加如下代码
public slots:
void open(HMedia& media);
void start();
添加start的定义,选中,右键,重构,添加定义
再在上面的open定义里调用
void HVideoWidget::open(HMedia &media)
{
this->media=media;
start();
}
void HVideoWidget::start()
{
}
ffmpeg播放器3 中提到了 start里的 pImpl_player 声明是HVideoPlayer,这里再添加一个HVideoPlayer的文件
双击hvideowidget.h,添加声明
#include "hvideoplayer.h"
private:
HMedia media;
HVideoPlayer* pImpl_player;
2.4 pImpl_player
从 ffmpeg播放器3 知道 pImpl_player 是使用工厂方法创建的 HFFPlayer,这里直接跳过,使用工厂方法的内容直接创建
先添加一个HFFPlayer的文件,继承HVideoPlayer
在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;
}
然后就能在hvideowidget.cpp中使用set_media了,如下代码所示
void HVideoWidget::start()
{
this->pImpl_player=new HFFPlayer();
this->pImpl_player->set_media(this->media);
}