Qt之显示yuv数据图像
来源:互联网 发布:python创建元组 编辑:程序博客网 时间:2024/05/21 21:00
【转载】http://blog.csdn.net/x348722662/article/details/53445136
目录(?)[+]
- Qt之显示yuv数据图像
- qt中利用mmfpeg将yuv转RGB32
- qt中将RGB32显示到label上
Qt之显示yuv数据图像
本文对在QT中实时显示yuv数据提供一个解决方案,再次特别非常感谢http://blog.yundiantech.com/中的博文,也是借鉴其中的播放YUV文件的demo实现实时播放yuv视频数据,废话不多说,就直接介绍显示效果最好的方法吧
- qt中利用mmfpeg将yuv转RGB32
- qt中将rbg显示到label上
qt中利用mmfpeg将yuv转RGB32
因为在QT中是无法直接显示yuv数据,所以我们必须把yuv数据转换成RGB32通过QImage来显示到控件中,具体的yuv和rgb的基本介绍就不在此给大家做介绍,需要知道原理的自行百度,如果想自己通过写转换代码来实现,也是可以的,只不过转换出来的效果不是太理想,特别是在纯白的背景时候,会有纯红,纯绿,纯蓝的颜色出现,导致整个颜色的偏差,所以我们直接采用mmfpeg中的yuv转rgb的方法,优化和效率都不错。
extern "C"{#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libswscale/swscale.h"#include "libavdevice/avdevice.h"}uint8_t *yuvBuffer;AVFrame *pFrame ;AVFrame *pFrameRGB;uint8_t * rgbBuffer;SwsContext *img_convert_ctx;//初始化void InitPlay(int width,int height){ //width和heigt为传入的分辨率的大小,实际应用我传的1280*720 int yuvSize = width * height * 3 /2; yuvBuffer = (uint8_t *)malloc(yuvSize); //为每帧图像分配内存 pFrame = av_frame_alloc(); pFrameRGB = av_frame_alloc(); int numBytes = avpicture_get_size(PIX_FMT_RGB32, width,height); rgbBuffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t)); avpicture_fill((AVPicture *) pFrameRGB, rgbBuffer, PIX_FMT_RGB32,width, height); //特别注意 img_convert_ctx 该在做H264流媒体解码时候,发现sws_getContext /sws_scale内存泄露问题, //注意sws_getContext只能调用一次,在初始化时候调用即可,另外调用完后,在析构函数中使用sws_free_Context,将它的内存释放。 //设置图像转换上下文 img_convert_ctx = sws_getContext(width, height, AV_PIX_FMT_YUV420P, width, height, PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL); } //实时接收yuv数据转换成rgb32 str是yuv数据,len为长度 void wb_yuv(void* str,int len){ avpicture_fill((AVPicture *) pFrame, (uint8_t *)str, AV_PIX_FMT_YUV420P, width, height);//这里的长度和高度跟之前保持一致 //转换图像格式,将解压出来的YUV420P的图像转换为RGB的图像 sws_scale(img_convert_ctx, (uint8_t const * const *) pFrame->data, pFrame->linesize, 0, height, pFrameRGB->data, pFrameRGB->linesize); //把这个RGB数据 用QImage加载 QImage tmpImg((uchar *)rgbBuffer,mWidth,mHeight,QImage::Format_RGB32); QImage image = tmpImg.copy(); //把图像复制一份 传递给界面显示 emit sig_GetOneFrame(image); //发送信号,将次imamge发送到要显示的控件,用paintEvent绘制出来}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
qt中将RGB32显示到label上
继承了一个QLbel的类,重写paintEvent事件,将RBG绘制到界面中
//接收sig_GetOneFrame信号,调用update在界面中显示图像void DecLabel::slotGetOneFrame(QImage img){ wb_Image = img; update(); //调用update将执行 paintEvent函数}//需要重写paintEvent事件void DecLabel::paintEvent(QPaintEvent *event){ QPainter painter(this); if (wb_Image.size().width() <= 0) return; ///将图像按比例缩放成和窗口一样大小 QImage img = wb_Image.scaled(this->size,Qt::IgnoreAspectRatio); int x = this->width() - img.width(); int y = this->height() - img.height(); painter.drawImage(QPoint(x,y),img); //画出图像}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
小结:实际应用中,因为我们有自己的解码库,将实时的H.264数据解码成YUV数据,但需要自己做显示,就借鉴FFMPEG中YUV转RGB32方法,实现之后效果还不错。
- 顶
- 0
- 踩
- 0
- 上一篇QT之QJson传输和中文乱码解决方案
- 下一篇QT之海康解码显示小技巧
相关文章推荐
- • qt线程 qthread(转)
- • qt采用opengl显示yuv视频数据
- • QT中显示图像数据
- • 基于QT和OpenCV的人脸识别系统
- • QT中用socket接收图像数据(JPEG)后立即解码显示
- • 本地音视频远程传输 QT技术
- • ffmpeg转换和显示yuv,rgb等原始图像数据
- • JPEG文件格式简单分析
- • Qt中用QLabel显示OpenCV中Mat图像数据出现扭曲现象的解决
- • QT使用QgraphicView/Qpainter展示RGB/YUV图像
阅读全文
0 0
- Qt之显示yuv数据图像
- Qt之显示yuv数据图像
- Qt之显示yuv数据图像
- qt采用opengl显示yuv视频数据
- QT中显示图像数据
- QT中显示图像数据
- D3D显示YUV图像
- 如何显示YUV图像
- SDL2显示YUV图像
- 【Qt开发】QT中显示图像数据
- ffmpeg转换和显示yuv,rgb等原始图像数据
- Android GLSurfaceView 显示YUV数据的坑,图像偏蓝色
- YUV图像数据分析
- YUV图像数据分析
- yuv数据显示
- opengles2.0 显示yuv数据
- Android4.2显示yuv数据
- ddraw 显示YUV视频数据
- FIFO控制程序
- 线程池(通俗易懂)
- sql语句查询语法
- 串口初始化
- 本地远程连接 liunx mysqlservice
- Qt之显示yuv数据图像
- 你的第一个中断程序!
- liunx:Shell 常用通配符:
- 串口服务器的理解---百度知道
- 用命令行自动生成mavn工程
- Makefile中echo -e 以及 输出$()和%.o 这两个字符串的问题
- log4net 自定义level
- HashMap源码分析
- Beyond Compare工具安装