Qt实现 基于ffmpeg拉流播放视频

ffmpeg(一) ffmpeg+QT开发环境搭建 (exe 程序编译的时候只需要包含 xxx.dll.a 静态导入库,运行的时候才需要 xxx.dll 文件)这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。导入库:不包含函数的具体实现代码(函数的具体实现代码存储在dll中) 阅读详情
AI摘要

本文介绍了如何使用Qt和FFmpeg库创建一个跨平台的视频播放器。通过QThread实现解码过程在子线程中运行,避免影响界面性能,QPainter用于视频帧的绘制。关键代码包括FFmpeg的初始化、解码接口以及Qt界面的绘制方法。最终提供了完整代码链接供参考。

1、前言

ffmpeg作为开源库,具备跨平台性,被广泛使用于各大视频软件和网站,在视音频开发中占有极其重要的地位。

Qt同样支持跨平台,因此结合qt+ffmpeg制作跨平台视频播放器是比较合适的做法。

2、思路

目前有一个界面类和解码类,其中界面类负责视频的显示工作,解码类的解码过程运行在子线程中,避免解码在主线程中进行,影响界面播放效果。二者的信息交互通过qt的信号槽关联,视频的绘制则采用QPainter绘制。

3、采用技术如下

1、QThread线程类

2、QPainter绘制类

3、FFmpeg主要接口

4、界面效果

5、主要代码

1、ffmpge初始化接口

int GetVideoData::InitFFmpeg(const char *filename)
{
	av_register_all();
	avformat_network_init();
	_pFormatCtx = avformat_alloc_context();

	if (avformat_open_input(&_pFormatCtx, filename, NULL, NULL) != 0)
	{
		qDebug() << "avformat_open_input failed";
		return -1;
	}
	if (avformat_find_stream_info(_pFormatCtx, NULL) < 0) 
	{
		qDebug() << "avformat_find_stream_info failed";
		return -1;
	}

	//视频
	_videoIndex = -1;
	for (int i = 0; i < _pFormatCtx->nb_streams; ++i)
	{
		if (_pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
			_videoIndex = i;
			break;
		}
	}
	if (_videoIndex == -1) 
	{
		qDebug() << "find  video stream failed";
		return -1;
	}
	_pCodecCtx = _pFormatCtx->streams[_videoIndex]->codec;
	_pCodec = avcodec_find_decoder(_pCodecCtx->codec_id);
	if (_pCodec == NULL) 
	{
		qDebug() << "find_decoder failed !";
		return -1;
	}
	if (avcodec_open2(_pCodecCtx, _pCodec, NULL) < 0) 
	{
		qDebug() << "open2 decoder failed";
		return -1;
	}

	//音频
	_audioIndex = -1;
	for (int i = 0; i < _pFormatCtx->nb_streams; ++i)
	{
		if (_pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
			_audioIndex = i;
			break;
		}
	}
	if (_audioIndex == -1) {
		qDebug() << "find  audio stream failed";
		return -1;
	}
	
	_aCodecCtx = _pFormatCtx->streams[_audioIndex]->codec;

	_pAvFrame = av_frame_alloc();

	_pFrameRGB32 = av_frame_alloc(); //存储解码后转换的RGB数据
	//保存RGB32
	int size = av_image_get_buffer_size(AV_PIX_FMT_RGB32, _pCodecCtx->width, _pCodecCtx->height, 1);
	_out_buffer = (uint8_t *)av_malloc(size);
	av_image_fill_arrays(_pFrameRGB32->data, _pFrameRGB32->linesize,_out_buffer, 
		AV_PIX_FMT_RGB32, _pCodecCtx->width, _pCodecCtx->height, 1);

	_packet = (AVPacket*)malloc(sizeof(AVPacket));
	qDebug() << "***********视频信息**********";
	av_dump_format(_pFormatCtx, 0, filename, 0);
	qDebug() << "*****************************";

	return 0;
}

2、ffmpeg解码接口

void GetVideoData::getRgb32Data()
{

	struct SwsContext *img_convert_ctx;
	//设置sws_scale转换格式为AV_PIX_FMT_RGB32
	img_convert_ctx = sws_getContext(_pCodecCtx->width, _pCodecCtx->height, _pCodecCtx->pix_fmt,
		_pCodecCtx->width, _pCodecCtx->height, AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);

	int ret;
	int got_picture_res;

	while (1)
	{
		if (_stop)
		{
			continue;
		}
		if (av_read_frame(_pFormatCtx, _packet) >= 0)
		{
			if (_videoIndex == _packet->stream_index) 
			{
				if (avcodec_decode_video2(_pCodecCtx, _pAvFrame, &got_picture_res, _packet) < 0)
				{
					qDebug() << "decode error";
					return;
				}
				AVStream *avStream = _pFormatCtx->streams[_packet->stream_index];

				_frame_rate = -1;
				if (avStream->avg_frame_rate.den)
					_frame_rate = avStream->avg_frame_rate.num / avStream->avg_frame_rate.den;

				if (got_picture_res)
				{
					sws_scale(img_convert_ctx, (const uint8_t* const*)_pAvFrame->data, _pAvFrame->linesize, 0,
						_pCodecCtx->height, _pFrameRGB32->data, _pFrameRGB32->linesize);
					emit sigUpdate((uchar*)_pFrameRGB32->data[0], _pCodecCtx->width, _pCodecCtx->height);
					QThread::msleep(40);
				}
			}
			av_free_packet(_packet);
		}
		else
			break;
	}
}

3、qt界面绘制接口

void IQtFFmpeg::showVideo()
{
	QPainter painter;
	painter.begin(this->ui.display_video);
	if (!_image.isNull())
	{
		painter.drawImage(0, 0, _image);
	}
	painter.end();
}

6、完整代码

https://download.youkuaiyun.com/download/c_shell_python/13114076

QT配置FFmpeg库 环境准备:QT 5.12.1。 阅读详情

相关推荐

FFMpeg-3、基于QT实现音视频播放显示

为什么要采用QT的OpenGL三维的来绘制,直接使用QopenWidget、QWight也是可以的,但是如果使用后面的那么其实图像显示和界面的按钮是一套东西,当点击按钮刷新的时候就会存在闪屏的情况。因为视频显示存在像素格式的转换问题,要从解码出来的YUV格式转化为显示需要的RGB格式,视频的每一帧图像这么多像素点都需要转换,这是一个很大的开销,如果这一部分效率不高,那么对整体的视频播放性能都是十分有影响的,而QTopenGL也是效率很高的,直接操作显卡。后台缓冲表面和前台表面的概念总是同时出现的。

yinshipin007的博客 2710

Qt使用ffmpeg

最终,还是逃不过要使用这个,一直看到却一直没正式了解它的库:ffmpeg。 这个库简单的说就是用来对视频进行各种处理的:读取、格式转换、播放等等。 目前我是在windows下,在Qt里面使用它的。 首先,到这里下载(通过官网也可以跳转到这里)。 我下载的是 ffmpeg-n4.4-latest-win64-lgpl-shared-4.4。你可以根据自己的需求下载。 然后在Qt里面引入库以及头文件 INCLUDEPATH += D:/Qt/ffmpeg/ffmpeg-n4.4-latest-win64-lgp

joyopirate的博客 8487

FFmpeg+nginx+rtmp windows下实现 推流、拉流

一、环境 1、开发环境:windows 2、开发工具:FFmpeg、nginx、nginx-rmtp-module ( ) 3、简介:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 nginx-rmtp-module是Nginx服务器的流媒体插件。nginx通过rtmp模块提供rtmp服务, ffmpeg推送一个rtmp流到nginx, 然后客户...

zhou_VisualStudio 的博客 1472

项目实战——Qt实现FFmpeg音视频转码器

本文记录使用 Qt 实现 FFmepg 音视频转码器项目的开发过程。

明天你好的博客 4333

最简单的GB28181视频PS流播放器。

一 从PS流中提取h264和aac。 移步:https://blog.youkuaiyun.com/qq_39805297/article/details/107083322 二 基于ffmpeg解码h264获取rgb图像,解码aac成pcm格式。 bool H264Decoder::init() { av_register_all(); _pCodecContext = avcodec_alloc_context3(NULL); _pH264VideoDecoder = avcodec_find_dec

qq_39805297的博客 3687

ffmpeg之rtmp推流阿里云转发vlc拉流播放

首先将视频数据以RTMP的形式发送到流媒体服务器端(Server,比如FMS,Red5,Wowza等),然后客户端(一般为Flash Player)通过访问流媒体服务器就可以收看实时流了。av_rescale_q_rnd():转换PTS/DTS(Convert PTS/DTS)

yinshipin007的博客 1623

《基于 FFmpeg 7 .0与 Qt 5.15.2 的 RTSP 与 MP4 拉流播放实现,未完成音频流播放》

ffmpeg7.0+QT5.15.2实现mp4播放和RTSP视频拉流

qq_35142153的博客 1015

Qt+MinGW32+FFmpeg+RTSP:Windows平台视频拉流播放编译实战

在Windows桌面应用开发中,视频监控与实时画面预览是常见需求,而Qt+FFmpeg的组合是构建跨平台视频播放器的经典方案。FFmpeg作为强大的多媒体处理库,封装了RTSP协议的解码与拉流逻辑,开发者只需调用其API即可获取视频帧。Qt则负责界面渲染与线程管理,通过信号槽机制实现流畅的实时显示。然而,选择MinGW32编译环境时,库版本匹配、链接顺序、DLL部署等细节往往成为工程落地的难点。本文从环境搭建、工程配置到核心代码实现,系统梳理了Qt+MinGW32+FFmpeg+RTSP的完整编译流程,并针

weixin_32927133的博客 239

Qt5 + FFmpeg

Qt5 + FFmpeg实现拉流,直播视频播放

ever__ever的博客 1608

Qt FFmpeg RTSP实时拉流播放:从环境配置到源码实现的完整指南

在音视频开发中,RTSP作为常用的流媒体传输协议,广泛应用于网络摄像头、视频监控等实时场景。要实现在桌面应用中播放RTSP流,核心链路涉及解复用、解码与渲染三阶段:FFmpeg负责协议解析与视频解码,生成原始YUV帧;Qt则承担界面显示与交互控制。通过合理配置传输协议、缓冲参数与超时中断,可有效解决花屏、延迟高、退出卡死等工程难题。从QMediaPlayer到VLC-Qt再到FFmpeg自绘方案,不同技术路线各有取舍,而基于FFmpeg的自研方案在帧级控制和自定义渲染上具备显著优势。本文以Qt结合FFmpe

weixin_32745665的博客 267

qt使用ffmpeg api进行摄像头视频流的读取,推流,拉流,视频播放等功能的实现

qt使用ffmpeg api进行摄像头视频流的读取,推流,拉流,视频播放等功能的实现。

ffmpeg推流+NGINX(RTMP)+VLC-QT拉流(Win7)

基于Win7系统,配置、编译实现以带RTMP模块的Nginx作为流媒体服务器,FFmpeg推流,VLC-QT拉流的RTMP流推拉全流程Demo

蚂蚁寻路 3052

英特尔® NUC迷你电脑实现无人值守自动开机配置指南

本文详细介绍了如何配置英特尔® NUC迷你电脑实现无人值守自动开机功能。从BIOS设置到操作系统级配置,涵盖硬件兼容性确认、电源恢复功能设置及常见问题解决,帮助用户轻松实现设备断电后自动恢复运行,适用于家庭服务器、企业终端等多种场景。

weixin_42638178的博客 472

[Qt学习笔记]Qt下调用vlc库实现拉流播放和截图

使用VLC-Qt库实现拉流播放效果

fengyaowuhui的博客 2260

Multisim实战:从零搭建体温检测报警电路(附完整仿真文件+调试技巧)

本文详细介绍了如何使用Multisim从零搭建体温检测报警电路,涵盖LM35温度传感器、LM358运算放大器等核心器件的选型与连接,以及信号调理、阈值比较和数码管显示等关键电路设计。附赠完整仿真文件和实用调试技巧,帮助电子工程初学者快速掌握体温温度检测系统的设计与实现。

weixin_28285943的博客 292

FPGA时钟架构解密:从SRCC/MRCC到全局时钟树的实战指南

本文深入解析Xilinx 7系列FPGA时钟架构,从SRCC/MRCC引脚特性到全局时钟树设计,详细介绍了BUFG、BUFMR等关键组件的应用场景和优化策略。通过对比SRCC与MRCC的驱动范围及适用场景,提供低抖动时钟布线技巧和时钟域交叉(CDC)设计方法,帮助工程师构建高性能FPGA时钟系统。

weixin_29191081的博客 1483

在Linux下基于QT实现ffmpeg视频流播放

1. 项目背景 下位机里安装里摄像头,并处理摄像头的实时数据。上位机通过rstp协议连接下位机,接收下位机传输的视频流数据。 2. 前言 ffmpeg是一个开源库,可制作跨平台视频播放器。 ffmpeg库的安装:《Linu下安装ffmpeg》 涉及的库有如下几个: avcodec avformat swscale avutil avcodec-ffmpeg swresample 3. 实现思路 ffmpeg视频流播放,比较占用系统资源,所以要使用多线程技术处理耗时操作。 ...

JJ的博客 3832

Origin作图——等高线图

最近做一个测试数据图,开始想通过用热图来展示,结果发现热图有很多的小方块,很难呈现出最好的效果,因为数据是有一层一层的递进效果,因此经过尝试后,发现等高线图是个好选择。 热图展示效果如下:其中有很多的小方块不适合,热图制图方法前面有记录。 下面展示等高线图制作方法。首先是导入数据,可以从excal导入,也可以直接复制进去。等方法。 选中要展示的数据,绘图----等高线图 选中箭头,确定。 双击图像,点击线,我们需要把线隐藏了. 双击图像,我们需要调色板,根据自己的选择,一般用调色板的颜色。

qq_42278015的博客 1万+

QT+ffmpeg学习笔记-自制一个简易播放器(二)

通过QPainter绘制视频播放页面的Qt应用程序,并将FFmpeg操作移至单独的线程,确保MainWindow仅负责UI显示。

qq_64263615的博客 2359

2025最新正版Autodesk 3ds Max 2022安装教程:从下载到中文环境配置全流程解析

Autodesk 3ds Max 2022是一款专业的三维建模、动画和渲染软件,广泛应用于影视制作、游戏开发、建筑可视化等领域。

waicsdn_haha的博客 1万+

YOLOv11改进 - 卷积Conv | GCNet之金箍棒块GCBlock : 重参数化捕获全局依赖 | CVPR 2025

文介绍了GCBlock在YOLOv11中的结合应用。GCBlock是GCNet的核心组件,能高效捕获特征图中的全局依赖关系,融合了非局部网络和挤压 - 激励网络的优势,降低计算成本并保障模型性能。其遵循“上下文建模 - 特征变换 - 特征融合”框架,通过全局平均池化、全连接层等操作生成注意力权重。我们将GCBlock集成进YOLOv11,替代原有的部分卷积模块,实现更高效的全局上下文建模。实验证明,YOLOv11-GCBlock在目标检测任务中表现出色,展现了GCBlock在深度学习中的广泛应用前景。

魔改工程师的博客 905

FFmpeg线程类封装+QT5实现直播拉流(含源代码)

FFmpeg线程类封装+QT5实现直播拉流(文末含源代码)

ever__ever的博客 1556

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

Qt + FFmpeg开发-打开视频文件(如mp4),或从流媒体服务器拉rtmp视频流

适用的业务场景:在linux下系统,qt的程序调用fmpeg库的api,打开视频文件(如mp4),或从流媒体服务器拉rtmp视频流。

m0_58836366的博客 730

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python)

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python)

前程算法屋的博客 900

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

基于QT+FFmpeg实现的视频播放demo

基于QT+FFmpeg实现的视频播放demo 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了一个基于QT和FFmpeg的视频播放demo,该demo支持通过ffmpeg开源库播放视频(包括rtsp流和文件),并通过QT框架实现界面显示。 使用说明 环境要求:本demo在mingw64位Qt环境中编译并可以直接运行。 兼容性:如果需要在32位或msvc版本的Qt环境...

gitblog_06777的博客 419

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: Qt实现 SDL嵌入Qt窗口中绘制图片
下一篇: ffmpeg库主要函数功能
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值