ffmpeg--libswscale(图像缩放、颜色空间和像素格式转换操作)

本文介绍了FFmpeg中的libswscale库,用于图像缩放和颜色空间及像素格式转换。内容包括像素格式的区分,如planar与packed格式、Big Endian与Little Endian的区别,以及YUV像素取值范围和色域的理解。通过实例展示了如何将YUV420P格式的视频转换为RGB24并调整分辨率。
摘要由CSDN通过智能技术生成

libswscale介绍

12种初始化方法:
struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
                                  int dstW, int dstH, enum AVPixelFormat dstFormat,
                                  int flags,//缩放算法
                                  SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param);
//或者sws_getCachedContext
//sws_getContext内部拆分:sws_alloc_context	+	av_opt_set_XXX	+	av_opt_set_XXX   【创建默认+设置参数】
//复杂但是灵活---可以配置一些sws_getContext()配置不了的参数
//比如说设置图像的YUV像素的取值范围是JPEG标准(Y、U、V取值范围都是0-255)还是MPEG标准(Y取值范围是16-235,U、V的取值范围是16-240)。


2、转换一帧图像:1.图像色彩空间转换;2.分辨率缩放;3.前后图像滤波处理。
int sws_scale(struct SwsContext *c, 
              const uint8_t *const srcSlice[], //源数据frame->date,
              const int srcStride[], //步幅,可以理解为图像的行宽frame->linesize 
              int srcSliceY, int srcSliceH,//开始处理的位置相对于图像的位置,若从头开始则是0,0
              uint8_t *const dst[], const int dstStride[]);//输出图像数据,输出图像宽度
              //返回输出图像高度

3、释放
void sws_freeContext(struct SwsContext *swsContext);

主要步骤:

最简单的基于FFmpeg的libswscale的示例(YUV转RGB)

①像素格式: 以“AV_PIX_FMT_”开头
1.后缀:P(planar格式),反之没有P👉默认为packed格式
  ①Planar格式不同的分量分别存储在不同的数组中 如:AV_PIX_FMT_YUV420P存储方式如下:
   data[0]: Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8……
   data[1]: U1, U2, U3, U4……
   data[2]: V1, V2, V3, V4……
  ②Packed格式的数据都存储在同一个数组中,如:AV_PIX_FMT_RGB24存储方式
   data[0]: R1, G1, B1, R2, G2, B2, R3, G3, B3, R4, G4, B4……
2.后缀:“BE(Big Endian格式) “LE”(Little Endian格式)
②图像拉伸
③YUV像素取值范围
④色域

实例:将视频从YUV420P格式转换为RGB24格式, 同时将分辨率从480x272拉伸为1280x720

#include <stdio.h>
#define __STDC_CONSTANT_MACROS
#include "libswscale/swscale.h"
#include "libavutil/opt.h"
#include "libavutil/imgutils.h"
 
int main(int argc, char* argv[])
{
   
	//Parameters	
	FILE *src_file =fopen("sintel_480x272_yuv420p.yuv", "rb");
	const int src_w=480,src_h=272;
	AVPixelFormat src_pixfmt=AV_PIX_FMT_YUV420P;
 
	int src_bpp=av_get_bits_per_pixel(av_pix_fmt_desc_get(src_pixfmt));
 
	FILE *dst_file = fopen("sintel_1280x720_rgb24.rgb", "wb");
	const int dst_w=1280,dst_h=720;
	AVPixelFormat dst_pixfmt=AV_PIX_FMT_RGB24;
	int dst_bpp=av_get_bits_per_pixel(av_pix_fmt_desc_get(dst_pixfmt));
 
	//Structures
	uint8_t *src_data[4];
	int src_linesize[4];
 
	uint8_t *dst_data[4];
	int dst_linesize[4];
 
	int rescale_method=SWS_BICUBIC;
	struct SwsContext *img_convert_ctx;
	uint8_t *temp_buffer=(uint8_t *)malloc(src_w*src_h*src_bpp/8);
	
	int frame_idx=0;
	int ret=0;
	// allocate source image
	ret= av_image_alloc(src_data, src_linesize,src_w, src_h, src_pixfmt, 1);

	//allocate destination image
	ret = av_image_alloc(dst_data, dst_linesize,dst_w, dst_h, dst_pixfmt, 1);

	//-----------------------------	
	//Init Method 1
	img_convert_ctx =sws_alloc_context();
	//Show AVOption
	av_opt_show2(img_convert_ctx,stdout,AV_OPT_FLAG_VIDEO_PARAM,0);
	//Set Value
	av_opt_set_int(img_convert_ctx,"sws_flags",SWS_BICUBIC|SWS_PRINT_INFO,0);
	av_opt_set_int(img_convert_ctx,"srcw",src_w,0);
	av_opt_set_int(img_convert_ctx,"srch",src_h,0);
	av_opt_set_int(img_convert_ctx,"src_format",src_pixfmt,0);
	//'0' for MPEG (Y:0-235);'1' for JPEG (Y:0-255)
	av_opt_set_int(img_convert_ctx,"src_range",1,0);
	av_opt_set_int(img_convert_ctx,"dstw"
在你提供的引用中没有涉及到关于Assertion desc failed的具体信息。然而,通常Assertion是一种在程序中用于检查某个条件是否为真的机制。当断言失败时,通常会抛出一个异常或终止程序的执行。在你提供的引用中,Assertion desc failed是在C:\install_dir\msys64\home\zwzn1417\ffmpeg-4.4.4\libswscale\swscale_internal.h文件的第677行处出现的。由于缺乏具体信息,很难准确地判断该断言失败的原因。要解决这个问题,你可以尝试以下步骤: 1. 确认你正在使用的是最新版本的ffmpeg。你可以从官方网站http://ffmpeg.org/下载并安装最新的版本。 2. 检查你的代码中是否有任何与swscale库相关的问题。确保你正确地使用了swscale库,并按照它的文档和示例进行操作。 3. 检查你的编译环境和依赖项。确认你的编译环境和依赖项都已正确配置,并且与ffmpeg的要求相匹配。 4. 如果问题仍然存在,你可以尝试在相关的开发者社区或论坛上寻求帮助。发布你的问题和相关的代码片段,以便其他开发者能够更好地理解和帮助你解决问题。 请注意,由于缺乏具体的错误信息和代码示例,上述步骤仅为一般性建议。在解决问题时,请始终参考相关文档和资源,并根据实际情况进行适当的调试和排查。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Assertion desc failed at libswscale/swscale_internal.h:674和ffmpeg的各种key+value](https://blog.csdn.net/weixin_43466192/article/details/125105073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [java: xcb_xlib.c:50: xcb_xlib_unlock: Assertion `c->xlib.lock' failed](https://download.csdn.net/download/xiebin1030/765111)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值