第六章:ffmpeg和QT开发播放器之创建线程

写在前面:

    这部分对应视频课程中的4-3~4-4。主要创建了线程,将解码和转码分开,提高视频的流畅度,最后能够打开外部视频进行播放。


1、创建线程

       在这之前的代码编译运行之后,能够正常使用,但是没创建线程,所以应该将视频解码放在一个线程里。

                               

       可以直接使用QT自带的线程,在线程中读取视频,并解码并且控制读取的速度。

       将之前在paintEvent中实现是读取视频、解码视频的函数逐步挪动到新创建的XVideoThread类中,同样的,如果有涉及到申请空间的就需要记得去释放空间。

       XFFmpeg::Get()->Decode(&pkt);解码完成之后,生成出来的yuv格式的数据,我们就需要将它转换成RGB格式的用于显示。转RGB的任务可以在该线程中直接做,然后需要用的时候直接将RGB数据copy过去。也可以在显示那边(paintEvent里面)做RGB转换再显示。

       这里我们选择将解码和转码分开来做,主要原因有:对于有些视频来说,解码就需要每一帧都解码,有些视频帧数又特别高,但是显示的时候不需要那么高的帧数。

       解码:需要控制解码的进度。每秒解码多少帧需要知道FPS。打开视频文件的时候可以获取到。
       转码:仅仅需要25帧就可以达到正常观看的效果了。

       在open视频的时候,先获取一下fps,以便于控制解码速率。

       fps = r2d(ic->streams[i]->avg_frame_rate);获取fps
       msleep(1000/XFFmpeg::Get()->fps);//每一帧的毫秒数

void XVideoThread::run()
{
	while (!isexit)
	{
		AVPacket pkt = XFFmpeg::Get()->Read(); //1、读取视频帧 
		if (pkt.size <= 0)
		{
			msleep(10);	//释放资源
			continue;
		}
		if (pkt.stream_index != XFFmpeg::Get()->videoStream)//如果是音频流,就先丢弃
		{
			av_packet_unref(&pkt);//释放空间
			continue;
		}

		XFFmpeg::Get()->Decode(&pkt);
		av_packet_unref(&pkt);//释放空间
		if(XFFmpeg::Get()->fps > 0)
			msleep(1000/XFFmpeg::Get()->fps);//每一帧的毫秒数
	}
}

2、修正ToRGB函数

       由于之前的torgb函数传入yuv参数,而yuv又是XFFmpeg里面的内部成员,所以在改动之后就不需要在多此一举了。
       更改前:bool ToRGB(const AVFrame *yuv,char *out,int outwidth, int outheight);
       更改后:bool ToRGB(char *out,int outwidth, int outheight);

3、通过QT打开外部视频

       打开qt编辑器,在工具栏中打开编辑信号槽,拖动之前创建的图标到右侧,会出现配置连接选项,在右侧栏点击编辑,创建一个open槽。点击左侧clicked后,选择右侧的open,这样就可以将点击事件和open函数绑定在一起了。

                           

       之后在xplay.h中追加一个信号槽
public slots:

void open(); //当界面上按钮按下之后,就会执行事先绑定的open函数

void Xplay::open()
{
	QString name = QFileDialog::getOpenFileName(
		this, QString::fromLocal8Bit("选择视频文件"));
	
	if (name.isEmpty())//如果没有选择文件
		return;

	this->setWindowTitle(name);//窗口标题为我们选择的文件

	if(!XFFmpeg::Get()->Open(name.toLocal8Bit()))
	{
		QMessageBox::information(this,"Error","file open failed!");
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt Creator 多线程读取文件到程序显示 利用QT Creator多任务读取一个文档到程序里 为了防止直接读取文件里的内容太大而发生卡顿,于是多线程读取将更高效的解决这个问题。 效果图如下: 其中pro文件无需改动,默认就好,头文件h里面的内容为 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MyObj; class MyObj : public QObject { Q_OBJECT public: MyObj(); //新的线程 signals: void toLine(QString line); private slots: void doWork(); }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void appendText(QString); //定义一个槽 private: Ui::MainWindow *ui; QThread *t; MyObj *obj; }; #endif // MAINWINDOW_H 而MAIN主文件的内容为了防止中文乱码做了如下修改: #include "mainwindow.h" #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); //设置中文字体 防止乱码 a.setFont(QFont("Microsoft Yahei", 9)); //设置中文编码 #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) #if _MSC_VER QTextCodec *codec = QTextCodec::codecForName("GBK"); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); #endif QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(codec); #endif MainWindow w; w.show(); return a.exec(); } 接下来重点来了,源文件CPP里为 #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); t = new QThread(); //QThread obj = new MyObj(); obj->moveToThread(t); qDebug()<<"main thread:"<<QThread::currentThread(); connect(t,SIGNAL(started()), obj, SLOT(doWork())); connect(obj,SIGNAL
FFmpeg是一套开源的多媒体处理库,可用于视频和音频的编解码、转码、剪辑等操作。QT是一个跨平台的图形用户界面开发框架,简化了开发过程,提供了丰富的GUI组件和工具。 "FFmpeg QT5开发播放器C实战视频课程完结"意味着这门课程以教授使用FFmpegQT5在C语言中开发多媒体播放器为主题,并且已经结束。通过这门课程,学习者可以系统地学习如何使用FFmpegQT5构建功能强大的播放器,实现各种视频和音频处理操作,如播放、暂停、快进、音量调节等。 这门课程可能包括以下内容:首先,学习者将了解FFmpegQT5的基本知识,包括它们的特点、功能和应用领域。然后,学习者将学习如何在C语言中使用FFmpeg进行视频和音频编解码、剪辑、转码等操作。接下来,学习者将学习如何在QT5中构建用户界面,包括视频窗口、控制按钮等。最后,学习者将学习如何将FFmpegQT5集成在一起,实现一个全功能的多媒体播放器。 通过这门课程,学习者可以掌握FFmpegQT5的使用技巧,了解多媒体处理的基本原理,提升自己的编程能力。他们可以进一步应用这些知识和技能,开发出更加复杂和创新的多媒体应用,满足不同用户的需求。 总之,这门FFmpeg QT5开发播放器C实战视频课程是一个理论与实践相结合的教学项目,它为学习者提供了学习和实践的机会,帮助他们掌握多媒体处理和应用开发的关键技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值