实时

您的位置:首页>企业 >

如何使用libswscale库将YUV420P格式的图像序列转换为RGB24格式输出? 环球观热点

一.视频格式转换初始化

将视频中的图像帧按照一定比例缩放或指定宽高进行放大和缩小是视频编辑中最为常见的操作之一,这里我们将1920x1080的yuv图像序列转换成640x480的rgb图像序列,并输出到文件。视频图像转换的核心为一个SwsContext结构,其中保存了输入图像和输出图像的宽高以及像素格式等多种参数。我们通过调用sws_getContext()函数就可以十分方便地创建并获取SwsContext结构的实例。下面给出初始化的代码:


(相关资料图)

//video_swscale_core.cppstatic AVFrame *input_frame= nullptr;static struct SwsContext *sws_ctx;static int32_t src_width=0,src_height=0,dst_width=0,dst_height=0;static enum AVPixelFormat src_pix_fmt=AV_PIX_FMT_NONE,dst_pix_fmt=AV_PIX_FMT_NONE;int32_t init_video_swscale(const char *src_size,const char *src_fmt,const char *dst_size,const char *dst_fmt){    int32_t result=0;    result=av_parse_video_size(&src_width,&src_height,src_size);    if(result<0){        cerr<<"Error:av_parse_video_size failed."<

初始化保存输入视频的AVFrame结构,并分配内存空间:

//video_swscale_core.cppstatic int32_t init_frame(int32_t width,int32_t height,enum AVPixelFormat pix_fmt){    int result=0;    input_frame=av_frame_alloc();    if(!input_frame){        cerr<<"Error:av_frame_alloc failed."<width=width;    input_frame->height=height;    input_frame->format=pix_fmt;    result= av_frame_get_buffer(input_frame,0);    if(result<0){        cerr<<"Error:av_frame_get_buffer failed."<

二.视频图像帧的循环转换

视频格式转换的核心函数是sws_scale(),我们需要给出输出图像的缓存地址和缓存宽度,然后循环处理即可。下面给出代码:

//video_swscale_core.cppint32_t transforming(int32_t frame_cnt){    int32_t result=0;    uint8_t *dst_data[4];    int32_t dst_linesize[4]={0},dst_bufsize=0;    result= av_image_alloc(dst_data,dst_linesize,dst_width,dst_height,dst_pix_fmt,1);    if(result<0){        cerr<<"Error:av_image_alloc failed."<linesize,0,src_height,dst_data,dst_linesize);        //write_packed_data_to_file(dst_data[0],dst_bufsize);        write_packed_data_to_file2(dst_data[0],dst_linesize[0],dst_width,dst_height);    }    av_freep(&dst_data[0]);    return 0;}

三.将转换后的图像帧写入输出文件

这里需要注意的是,由于我们转换后的图像格式是rgb24,是按packed方式存储的,也就是红绿蓝三个通道交错地存储在一个平面内,在内存中是连续存储的。也就是说,转换后的图像数据全部保存在dst_data[0]指向的内存空间中。下面给出代码:

//io_data.cppint32_t write_packed_data_to_file2(uint8_t *data,int32_t linesize,int32_t width,int32_t height){    for(int i=0;i

四.释放资源

void destroy_video_swscale(){    av_frame_free(&input_frame);    sws_freeContext(sws_ctx);}

还有其他的文件打开和关闭以及将yuv图像读到AVFrame结构中的代码请看我之前的博客。

五.main函数实现

int main(){    int result=0;    const char *input_file_name="../input.yuv";    const char *input_pic_size="1920x1080";    const char *input_pix_fmt="YUV420P";    const char *output_file_name="../output.rgb";    const char *output_pic_size="640x480";    const char *output_pix_fmt="RGB24";    result= open_input_output_files(input_file_name,output_file_name);    if(result<0){        return -1;    }    result=init_video_swscale(input_pic_size,input_pix_fmt,output_pic_size,output_pix_fmt);    if(result<0){        return -1;    }    result=transforming(250);    if(result<0){        return -1;    }    destroy_video_swscale();    close_input_output_files();    return 0;}

最后,可以用以下指令测试输出的output.rgb文件:

ffplay -f rawvideo -video_size 640x480 -pixel_format rgb24 -i output.rgb

关键词:

推荐阅读
一 视频格式转换初始化将视频中的图像帧按照一定比例缩放或指定宽高进

2023-07-04 10:19:09

为进一步加强社会信用体系建设,提高社会公众的信用意识和维权意识,6

2023-07-04 10:09:46

资产置换并购是指上市公司用一定价值的资产并购等值优质资产的产权交易

2023-07-04 09:57:45

7月3日北京各区2023小升初派位结果可以查询,家长们可以查询了解学生小

2023-07-04 09:19:44

7月起,怀柔区慕田峪长城景区重启“夜游”模式,营业时间延至21时,同

2023-07-04 09:02:41

截至2023年7月3日收盘,中国石油(601857)报收于7 82元,上涨4 69%,换

2023-07-04 08:22:28

中央气象台7月3日继续发布暴雨蓝色预警,山东、陕西、四川等地遭受新一

2023-07-04 07:48:24

近日,据网络爆料,GPD计划推出新款WinMini掌机很可能配备AMD新一代的R

2023-07-04 06:06:17

1、施恩,《水浒传》中一百单八将之一,绰号“金眼彪”,在小说第二十

2023-07-04 04:58:54

macbook2022预计将会在2022年5月正式发布的。macbook2022采用圆润薄型

2023-07-04 03:11:36

1、怎么查询自己的银行卡号是多少?方法1:查看自己的银行卡,银行卡上

2023-07-04 01:10:39

1、谢谢。2、介绍了这么好玩的游戏。本文分享完毕,希望对大家有所帮助

2023-07-03 23:04:52

1、◎浙江省宁波市海曙区姚丰村姚家邮编:315175◎浙江省宁波市海曙区

2023-07-03 22:01:55

泰恩康接待百年保险资产管理有限责任公司等多家机构调研

2023-07-03 21:24:02

直播吧7月3日讯中超第14轮,亚泰vs河南比赛第10分钟,塞尔吉尼奥持球被

2023-07-03 20:34:27

央视网消息:2023国际数字能源展于6月29日至7月2日在深圳举行。展会当

2023-07-03 19:50:08

》》》东莞普通话水平测试证书邮寄办理方式一览网页端办理:办理入口:

2023-07-03 19:29:35

1、截止到2020年1月11号,大概需要150元,不同的车价格会有所差异。2、

2023-07-03 18:50:35

说起新能源纯电动汽车,当然不得不提比亚迪e2(参数|询价),比亚迪e2车

2023-07-03 18:12:31

北上资金今日净买入宁德时代(300750)4 49亿元、比亚迪(002594)3 80亿元

2023-07-03 17:47:58