从0开始写Qt视频播放器----RGB格式

Qt视频播放器实现(目录)

RGB的使用场景

目前,数字信号源(直播现场的数字相机采集的原始画面)和显示设备(手机屏幕、笔记本屏幕、个人电脑显示器屏幕)使用的基本上都是RGB格式。

三原色

RGB是从颜色的原理来设计定的,它的颜色混合方式就如有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混亮度等于两者亮度之总和,即加法混合

屏幕上的不同颜色,都由这红色,绿色,蓝色三种基本色光按照不同的比例(权重)混合而成的。

屏幕上的任何一个像素的颜色都可以由一组RGB值来记录和表达。

因此这红色绿色蓝色又称为三原色光,用英文表示就是R(red)、G(green)、B(blue)。

RGB表示颜色

RGB的所谓“多少”就是指亮度,并使用整数来表示。

在用8位(1字节)表示时,RGB每个分量有256级亮度,用数字量化表示为从0、1、2...直到255。注意:虽然数字最高是255,但0也是数值之一,因此共256级。

如下图表示RGB色彩空间从R,G,B三个维度看到的图像:

RGB文件(BMP)

当我们在键盘上按下 print screen 键,再打开Windows自带的画图软件,按Ctrl+V 粘贴的时候。我们得到的就是桌面的截图了。

可以看到画图下方显示的分辨率为你桌面的分辨率:比如,我的笔记本是 1920x1080

此时,另存为(不要直接保存)BMP文件:

另存为的时候选择 24位位图:RGB分量(每个分量8位,三个分量 24位)

此时,我们就得到了屏幕截图的RGB格式图片。

邮件图片属性,可以看到如下信息:

我的屏幕分辨率是 1920x1080, 每个像素 RGB 是 3个字节。

一共需要:1920x1080x3 = 6220800 字节 

也就是:5.93 MB

细心的你会发现,文件大小比 6220800大了54个字节,文件大小为6220854。

这54字节是固定的,是BMP文件格式的头部。

RGB是我们后面经常会遇到的数据格式,BMP文件是我们处理这种格式的常见载体。

怎么样?有意思吧

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt中使用FFmpeg实现视频播放器的主要步骤如下: 1. 首先,确保您已经正确配置了Qt项目以使用FFmpeg库。可以通过在项目的.pro文件中添加相关配置来实现。例如: ``` LIBS += -lavformat -lavcodec -lavutil ``` 2. 创建一个Qt窗口来显示视频。您可以使用QWidget或QOpenGLWidget来实现。在窗口中,您可以使用QMediaPlayer或QVideoWidget来播放视频。 3. 初始化FFmpeg库并打开视频文件。可以使用avformat_open_input函数打开视频文件,并使用avformat_find_stream_info函数获取视频流的相关信息。 ```cpp AVFormatContext *formatContext = avformat_alloc_context(); if (avformat_open_input(&formatContext, "video.mp4", nullptr, nullptr) != 0) { // 打开视频文件失败 return; } if (avformat_find_stream_info(formatContext, nullptr) < 0) { // 获取视频流信息失败 return; } ``` 4. 查找视频流并创建解码器。根据视频流的类型,您可以使用avcodec_find_decoder函数查找合适的解码器,并使用avcodec_open2函数打开解码器。 ```cpp int videoStreamIndex = -1; for (int i = 0; i < formatContext->nb_streams; i++) { if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; break; } } if (videoStreamIndex == -1) { // 未找到视频流 return; } AVCodecParameters *codecParameters = formatContext->streams[videoStreamIndex]->codecpar; AVCodec *codec = avcodec_find_decoder(codecParameters->codec_id); if (codec == nullptr) { // 找不到解码器 return; } AVCodecContext *codecContext = avcodec_alloc_context3(codec); if (avcodec_open2(codecContext, codec, nullptr) < 0) { // 打开解码器失败 return; } ``` 5. 创建一个AVFrame对象来保存解码后的视频帧数据。使用av_frame_alloc函数创建AVFrame对象,并使用av_image_alloc函数分配内存。 ```cpp AVFrame *frame = av_frame_alloc(); int numBytes = av_image_get_buffer_size(AV_PIX_FMT_RGB24, codecContext->width, codecContext->height, 1); uint8_t *buffer = (uint8_t *)av_malloc(numBytes * sizeof(uint8_t)); av_image_fill_arrays(frame->data, frame->linesize, buffer, AV_PIX_FMT_RGB24, codecContext->width, codecContext->height, 1); ``` 6. 从视频流中读取数据并进行解码。使用av_read_frame函数从视频流中读取一帧数据,并使用avcodec_send_packet和avcodec_receive_frame函数进行解码。 ```cpp AVPacket packet; while (av_read_frame(formatContext, &packet) >= 0) { if (packet.stream_index == videoStreamIndex) { avcodec_send_packet(codecContext, &packet); while (avcodec_receive_frame(codecContext, frame) == 0) { // 解码成功,可以处理解码后的视频帧数据 // 在Qt窗口中显示视频帧 } } av_packet_unref(&packet); } ``` 7. 在Qt窗口中显示视频帧。您可以使用QImage或QOpenGLTexture来显示解码后的视频帧数据。 以上是使用Qt和FFmpeg实现视频播放器的基本步骤。根据您的具体需求和界面设计,您可能需要进行更多的处理和优化。 请注意,FFmpeg是一个功能强大但也复杂的库,提供了很多功能和选项。在实际开发中,您可能需要进一步了解FFmpeg的API和使用方法来满足您的需求。 希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值