ffmpeg播放器2

98 阅读2分钟

1 背景

上一篇安装了qt之后,简单试了个Demo,这一篇开始整理hplayer相关的代码。

2 详细步骤

2.1 MainWindow.cpp

void MainWindow::initMenu() 
QAction* actOpenFile = new QAction(QIcon(":/image/file.png"), tr(" Open File"));
actOpenFile->setShortcut(QKeySequence("Ctrl+F"));
connect(actOpenFile, &QAction::triggered, this, [=](){
OpenMediaDlg(MEDIA_TYPE_FILE);
});
mediaMenu->addAction(actOpenFile);
mediaToolbar->addAction(actOpenFile);

这里打开了媒体文件,再查看槽的实现

#include "HOpenMediaDlg.h"
void MainWindow::OpenMediaDlg(int index) {
HOpenMediaDlg dlg(this);
dlg.tab->setCurrentIndex(index);
if (dlg.exec() == QDialog::Accepted) {
center->mv->play(dlg.media);
}
}

接下来看dlg的media怎么实现的

2.2 HOpenMediaDlg.h有如下

public slots:
virtual void accept();

protected:
void initUI();
void initConnect();

public:
QTabWidget* tab;
HMedia media;
};

再查看src/video/hmedia.h

typedef struct media_s {
media_type_e type;
std::string src;
std::string descr;
int index; // for camera index

media_s() {
type = MEDIA_TYPE_NONE;
index = -1;
}
}HMedia;

这里可以看到media是一个结构体,包含了type,src和index

再从HOpenMediaDlg.cpp 再次查看media怎么填充的

void HOpenMediaDlg::initUI() {

connect(btns, &QDialogButtonBox::accepted, this, &QDialog::accept);

这里调用了accept的槽,查看具体实现

void HOpenMediaDlg::accept() {
switch (tab->currentIndex()) {
case MEDIA_TYPE_FILE:
{
FileTab* filetab = qobject_cast<FileTab*>(tab->currentWidget());
if (filetab) {
media.type = MEDIA_TYPE_FILE;
media.src = filetab->edit->text().toUtf8().data();
g_confile->SetValue("last_file_source", media.src.c_str(), "media");
g_confile->Save();
}
}

这里调用了对话框,选择文件后保存文件的地址

FileTab::FileTab(QWidget *parent) : QWidget(parent) {

btnBrowse = new QPushButton("...");
connect(btnBrowse, &QPushButton::clicked, this, [=]() {
QString file = QFileDialog::getOpenFileName(this, tr("Open Meida File"), "",
"Video Files(*.3gp *.amv *.asf *.avi *.flv *.m2v *.m4v *.mkv *.mp2 *.mp4 *.mpg *.swf *.ts *.rmvb *.wmv)\n"
"All Files(*)");
if (!file.isEmpty()) {
edit->setText(file);
}
});

2.3 media怎么播放的

之前2.1中有如下代码

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

这里去找center中的mv是怎么实现的

MainWindow.h中有如下

CentralWidget* center;

CentralWidget.h中有如下

class CentralWidget : public QWidget {
public:
HMultiView* mv;

继续去mv中找对应的play方法 在HMultiView.h中有如下

class HMultiView : public QWidget

public slots:
void play(HMedia& media);

查看cpp中具体实现

void HMultiView::play(HMedia& media) {
HVideoWidget* player = getIdlePlayer();
if (player == NULL) {
QMessageBox::information(this, tr("Info"), tr("No spare player, please stop one and try agian!"));
}
else {
player->open(media);
}
}

2.4 未完待续