首页 > 其他分享 >【音视频系列】RGB24数据格式及BMP文件格式以及存储方式

【音视频系列】RGB24数据格式及BMP文件格式以及存储方式

时间:2023-08-22 14:46:29浏览次数:44  
标签:int unsigned long 音视频 char BMP 文件格式 数据格式 size

RGB24是表明图像以RGB三原色,每个像素点3个字节表示的一种图像存储格式

  注意:在内存中RGB各分量的排列顺序为:BGR BGR BGR 

先用ffmpeg生成一个RGB24的图片,命令如下:

  ffmpeg -i test.jpg -pix_fmt rgb24 test.rgb

生成后下面用C++代码拆分RGB24的三原色并保存:

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 void read_split_rgbfile(const char* file, int width, int height, int frames) {     FILE* rgbFp = fopen(file, "rb+");     FILE* rFp = fopen("e:\\test_r.y""wb+");     FILE* gFp = fopen("e:\\test_g.y""wb+");     FILE* bFp = fopen("e:\\test_b.y""wb+");       int size = width * height;     unsigned char * buf = (unsigned char*)malloc(size * 3);     unsigned char * rbuf = (unsigned char*)malloc(size);     unsigned char * gbuf = (unsigned char*)malloc(size);     unsigned char * bbuf = (unsigned char*)malloc(size);       int ridx, gidx, bidx;     ridx = gidx = bidx = 0;     for (int i = 0; i < frames; i++)     {         fread(buf, 1, size * 3, rgbFp);         for (int rgbidx = 0; rgbidx < size * 3; rgbidx = rgbidx + 3)         {             rbuf[ridx++] = buf[rgbidx];             gbuf[gidx++] = buf[rgbidx + 1];             bbuf[bidx++] = buf[rgbidx + 2];         }         fwrite(rbuf, 1, size, rFp);         fwrite(gbuf, 1, size, gFp);         fwrite(bbuf, 1, size, bFp);     }     free(buf);     free(rbuf);     free(gbuf);     free(bbuf);     fclose(rgbFp);     fclose(rFp);     fclose(gFp);     fclose(bFp); }

用YUVPlayer使用Y通道分别查看R,G,B三原色文件,如果均能显示即表示生成没有问题

  由此可以学习RGB三原色在文件中的存储方式

 

RGB24转储为BMP文件

BMP文件格式为:

  BMP文件头+BMP文件信息头+RGB三原色(注意:此时存储序列为BGRBGRBGR.....)

BMP文件头如下:

1 2 3 4 5 6 7 8 typedef struct tagBITMAPFILEHEADER {     UINT16 bfType;     DWORD bfSize;     UINT16 bfReserved1;     UINT16 bfReserved2;     DWORD bfOffBits; } BITMAPFILEHEADER;

  

 

BMP文件信息头如下:

  

 

 调色板可略

使用C++代码将RGB数据转储为BMP文件代码如下:

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 46 47 48 49 50 51 52 53 54 typedef struct {     long imageSize;     long blank;     long startPos; }BMPHead; typedef struct {     long length;     long width;     long height;     unsigned short colorPlane;     unsigned short bitColor;     long zipFormat;     long realSize;     long xPels;     long yPels;     long colorUse;     long colorImportant; }INFOHead; void muxer_rgb24_to_bmp(const char* rgbfile, int width, int height, const char * bmpfile) {     FILE* rgbFp = fopen(rgbfile, "rb+");     FILE* bmpFp = fopen(bmpfile, "wb+");     int size = width * height;     char bmpType[] = { 'B','M' };     BMPHead bHead = { 0 };     INFOHead bIHead = { 0 };     int head_length = sizeof(bmpType) + sizeof(BMPHead) + sizeof(INFOHead);     bHead.imageSize = size * 3 + head_length;     bHead.startPos = head_length;       bIHead.length = sizeof(INFOHead);     bIHead.width = width;     bIHead.height = -height; //注意此处的高度为负       bIHead.colorPlane = 1;     bIHead.bitColor = 24;     bIHead.realSize = size * 3;     fwrite(bmpType, 1, sizeof(bmpType), bmpFp);     fwrite(&bHead, 1, sizeof(BMPHead), bmpFp);     fwrite(&bIHead, 1, sizeof(INFOHead), bmpFp);       unsigned char* rgbBuf = (unsigned char*)malloc(size * 3);     fread(rgbBuf, 1, size * 3, rgbFp);     for (int i=0;i <size*3;i+=3)  //调整R和B的顺序     {         int tmp = rgbBuf[i];         rgbBuf[i] = rgbBuf[i + 2];         rgbBuf[i + 2] = tmp;     }     fwrite(rgbBuf, 1, size * 3, bmpFp);     free(rgbBuf);     fclose(bmpFp);     fclose(rgbFp); }

  输出文件为BMP文件,可以直接查看生成是否正确

标签:int,unsigned,long,音视频,char,BMP,文件格式,数据格式,size
From: https://www.cnblogs.com/lidabo/p/17648490.html

相关文章

  • 对话音视频牛哥:开发RTSP|RTMP直播播放器难不难?难在哪?
    我关注的播放器指标好多开发者跟我交流音视频相关技术的时候,经常问我的问题是,多久可以开发个商业级别的RTMP或RTSP播放器?你们是怎样做到毫秒级延迟的?为什么一个播放器,会被你们做到那么复杂?带着这些疑问,结合Windows平台RTMP、RTSP播放模块,探讨下我的一点心得,不当之处权当抛砖引玉:1.......
  • 基础入门-算法分析&传输加密&数据格式&密文存储&代码混淆&逆向保护
    基础入门-算法分析&传输加密&数据格式&密文存储&代码混淆&逆向保护基础入门-算法分析&传输加密&数据格式&密文存储&代码混淆&逆向保护传输数据-编码型&加密型等传输格式-常规&JSON&XML等密码存储-Web&系统&三方应用代码混淆-源代码加密&逆向保护加密:1.常见加密编码进制等算法解......
  • 音视频FAQ(一):视频直播卡顿
    一、摘要本文介绍了视频直播卡顿的四个主要原因,用户网络问题、用户设备性能问题、技术路线的选择和实现问题。因本文主要阐述视频直播的卡顿,故技术路线的实现指的是:CDN供应商的实现问题,包含CDN性能不足、CDN地区覆盖不足。对于每个原因,提供了初步判断和进一步诊断的方法和技术工具,......
  • 音视频FAQ(一):视频直播卡顿
    一、摘要本文介绍了视频直播卡顿的四个主要原因,用户网络问题、用户设备性能问题、技术路线的选择和实现问题。因本文主要阐述视频直播的卡顿,故技术路线的实现指的是:CDN供应商的实现问题,包含CDN性能不足、CDN地区覆盖不足。对于每个原因,提供了初步判断和进一步诊断的方法和技术工......
  • 音视频FAQ(三):音画不同步
    摘要本文介绍了音画不同步问题的五个因素:编码和封装阶段、网络传输阶段、播放器中的处理阶段、源内容产生的问题以及转码和编辑。针对这些因素,提出了相应的解决方案,如使用标准化工具、选择强大的传输协议、自适应缓冲等。此外,介绍了第三方音视频服务商如即构的解决方案,包括优化的......
  • String的几种常见数据格式化
    一、日期格式化常用的日期格式化转换符:%te:一月中的某一天(1-31) 2%tb:指定语言环境的月份简称 Feb或二月%tB:指定语言环境的月份全称 February或二月%tA:指定语言环境的星期几全称Monday、星期一%ta:指定语言环境的星期几简称Mon、星期一%tc:包括全部日期和时间信息%tY:4位年......
  • 对话音视频牛哥:如何设计功能齐全的跨平台低延迟RTMP播放器
    开发背景2015年,我们在做移动单兵应急指挥项目的时候,推送端采用了RTMP方案,这在当时算是介入RTMP比较早的了,RTMP推送模块做好以后,我们找了市面上VLC还有Vitamio,来测试整体延迟,实际效果真的不尽人意,大家知道,应急指挥系统,除了稳定性外,对延迟有很高的要求,几秒钟(>3-5秒)的延迟,是我们接受不......
  • Unreal Engine 5.2 .uasset文件格式分析
       以下内容只包含UE5的5.2版本,不包含兼容性内容,不同版本可能会有所不同。提示:   N :通常代表数组个数  ? :代表不确定,比如字符串的长度。  * :乘积  TypeName:Size:此说明并非定义位域,是在说明此处的数据类型、名称以及空间占用,空间单位为字......
  • 让Photoshop支持.ICO文件格式
    需要安装一个文件插件ICOFormat.8bi。官方下载地址:http://www.telegraphics.net/sw/下载以后的存放路径:...\Required\Plug-ins\FileFormats参考网址:https://blog.csdn.net/weixin_44222492/article/details/101596183......
  • Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP
    一对一音视频通话使用场景一对一音视频通话都需要稳定、清晰和流畅,以确保良好的用户体验,常用的使用场景如下:社交应用:社交应用是一种常见的使用场景,用户可以通过音视频通话进行面对面的交流;在线教育:老师和学生可以通过音视频通话功能进行实时互动,提高教学效率;远程协助:在某些工作场景......