sws_getContext函数详细使用

article/2025/9/12 22:56:36

成功后返回SwsContext 类型的结构体。

参数1:被转换源的宽

参数2:被转换源的高

参数3:被转换源的格式,eg:YUV、RGB……(枚举格式,也可以直接用枚举的代号表示eg:AV_PIX_FMT_YUV420P这些枚举的格式在libavutil/pixfmt.h中列出)

参数4:转换后指定的宽

参数5:转换后指定的高

参数6:转换后指定的格式同参数3的格式

参数7:转换所使用的算法,

参数8:NULL

参数9:NULL

参数10:NULL

 转自:http://guguclock.blogspot.com/2009/12/ffmpeg-swscale.html

    

    如果想將某個PixelFormat轉換至另一個PixelFormat,例如,將YUV420P轉換成YUYV422,或是想變換圖的大小,都可以使用swscale達成。

其中,PixelFormat 的列表在 libavutil/pixfmt.h 內定義。

swscale的用法可以參考libswscale/swscale-example.c的sample code。主要function有三個
sws_getContext() 
sws_scale() 
sws_freeContext() 

其中,我們可以把sws_getContext() 看成初始化函數,把sws_freeContext()看成結束函數。這兩個函數分別在起始及結束各執行一次即可。

真正主要的函數,是sws_scale()。

sws_getContext() 的宣告如下

SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int dstW, int dstH, enum PixelFormat dstFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param)

總共有十個參數,其中,較重要的是前七個; 
前三個參數分別代表 source 的寬、高及PixelFormat; 
四到六個參數分別代表 destination 的寬、高及PixelFormat; 
第七個參數則代表要使用哪種scale的方法;此參數可用的方法可在 libswscale/swscale.h 內找到。

最後三個參數,如無使用,可以都填上NULL。

sws_getContext會回傳一個 SwsContext struct,我們可以把這個 struct 看成是個 handler,之後的sws_scale和sws_freeContext皆會用到。

以下是一個sws_getContext的簡單例子:

struct SwsContext *img_convert_ctx; 
img_convert_ctx = sws_getContext(in_width, in_height, PIX_FMT_YUV420P, 
out_width, out_height, PIX_FMT_YUV420P, SWS_POINT, 
NULL, NULL, NULL);

一開始,我們宣告img_convert_ctx 為指向 SwsContext 的一個 pointer;接著,我們將 sws_getContext 的回傳值賦予給img_convert_ctx。

注意sws_getContext的參數;in_width及in_height分別代表 source 的寬及高,out_width及out_height分別代表轉換後的寬與高;input 和 output 的 PixelFormat 皆為 YUV420P;使用SWS_POINT的scale方法。

初始化完成後,接著就要進行主要的 scale 動作;我們透過 sws_scale() 完成。sws_scale() 的宣告如下

int sws_scale(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[])

總共有七個參數; 
第一個參數即是由 sws_getContext 所取得的參數。 
第二個 src 及第六個 dst 分別指向input 和 output 的 buffer。 
第三個 srcStride 及第七個 dstStride 分別指向 input 及 output 的 stride;如果不知道什麼是 stride,姑且可以先把它看成是每一列的 byte 數。
第四個 srcSliceY,就註解的意思來看,是指第一列要處理的位置;這裡我是從頭處理,所以直接填0。想知道更詳細說明的人,可以參考 swscale.h 的註解。
第五個srcSliceH指的是 source slice 的高度。

舉一個例子如下

sws_scale(img_convert_ctx, inbuf, inlinesize, 0, in_height, outbuf, outlinesize);

這裡應該比較好懂,可以參考上面的參數說明。

最後,全部處理完後,需呼叫sws_freeContext() 結束。用法很簡單,把sws_getContext 取得的參數填入即可。如下

sws_freeContext(img_convert_ctx);

最後再整理一次,要使用swscale,只要使用 sws_getContext() 進行初始化、sws_scale() 進行主要轉換、sws_freeContext() 結束,即可完成全部動作。

以下為一個簡單的範例程式,可從foreman.yuv內取出第一張圖,轉換大小後存成另一張圖。

=====================================================================================

/* 
* 需設定 SRCFILE 及 DSTFILE, 長寬等資訊 
* 需 link libswscale 
* 主要有三個 function 
* sws_getContext() 是 initial 用, sws_freeContext() 是結束用 
* sws_scale() 是主要運作的 function 
* 預設只會轉換第一張 YUV, 如果要轉換整個檔, 可以把 Decoding loop 的註解拿掉 
*/ 

#include "libswscale/swscale.h" 

#define SRCFILE "foreman_cif.yuv" 
#define DSTFILE "out.yuv" 

int main() 

// 設定原始 YUV 的長寬 
const int in_width = 352; 
const int in_height = 288; 
// 設定目的 YUV 的長寬 
const int out_width = 640; 
const int out_height = 480; 

const int read_size = in_width * in_height * 3 / 2; 
const int write_size = out_width * out_height * 3 / 2; 
struct SwsContext *img_convert_ctx; 
uint8_t *inbuf[4]; 
uint8_t *outbuf[4]; 
int inlinesize[4] = {in_width, in_width/2, in_width/2, 0}; 
int outlinesize[4] = {out_width, out_width/2, out_width/2, 0}; 

uint8_t in[352*288*3>>1]; 
uint8_t out[640*480*3>>1]; 

FILE *fin = fopen(SRCFILE, "rb"); 
FILE *fout = fopen(DSTFILE, "wb"); 

if(fin == NULL) { 
printf("open input file %s error.\n", SRCFILE); 
return -1; 


if(fout == NULL) { 
printf("open output file %s error.\n", DSTFILE); 
return -1; 


inbuf[0] = malloc(in_width*in_height); 
inbuf[1] = malloc(in_width*in_height>>2); 
inbuf[2] = malloc(in_width*in_height>>2); 
inbuf[3] = NULL; 

outbuf[0] = malloc(out_width*out_height); 
outbuf[1] = malloc(out_width*out_height>>2); 
outbuf[2] = malloc(out_width*out_height>>2); 
outbuf[3] = NULL; 

// ********* Initialize software scaling ********* 
// ********* sws_getContext ********************** 
img_convert_ctx = sws_getContext(in_width, in_height, PIX_FMT_YUV420P, 
out_width, out_height, PIX_FMT_YUV420P, SWS_POINT, 
NULL, NULL, NULL); 
if(img_convert_ctx == NULL) { 
fprintf(stderr, "Cannot initialize the conversion context!\n"); 
return -1; 


fread(in, 1, read_size, fin); 

memcpy(inbuf[0], in, in_width*in_height); 
memcpy(inbuf[1], in+in_width*in_height, in_width*in_height>>2); 
memcpy(inbuf[2], in+(in_width*in_height*5>>2), in_width*in_height>>2); 

// ********* 主要的 function ****** 
// ********* sws_scale ************ 
sws_scale(img_convert_ctx, inbuf, inlinesize, 
0, in_height, outbuf, outlinesize); 

memcpy(out, outbuf[0], out_width*out_height); 
memcpy(out+out_width*out_height, outbuf[1], out_width*out_height>>2); 
memcpy(out+(out_width*out_height*5>>2), outbuf[2], out_width*out_height>>2); 

fwrite(out, 1, write_size, fout); 

// ********* 結束的 function ******* 
// ********* sws_freeContext ******* 
sws_freeContext(img_convert_ctx); 

fclose(fin); 
fclose(fout); 

return 0; 

 


http://chatgpt.dhexx.cn/article/spjVqL0M.shtml

相关文章

canvas中getContext(“2d“) 对象的属性和方法

HTML5中canvas标签用于绘制图像(通过脚本,通常是Js)。 也就是说,canvas元素本身没有绘制能力仅仅是图形容 - 您必须使用脚本来完成实际的绘图任务。 getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的…

Debug:无法找到 getContext() 方法

Mybatis反向生成Swagger自动注释 - SegmentFault 思否 在使用该插件时 无法找到 getContext() 方法,是因为 mybatis-generator-core版本高于1.4.0,建议使用1.4.0一下版本进行构建

Android Context解析以及getContext()、getApplication()、getApplicationContext()和getBaseContext()区别

文章目录 Context 介绍Context数量getContext()、getApplication()、getApplicationContext()和getBaseContext()区别getContextgetApplication()、getApplicationContext()getBaseContext() Context 介绍 Android程序不像Java程序一样,随便创建一个类,…

sws_getContext和sws_scale分析

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);创建转换上下文,参数分析:…

View Fragment Window 的 getContext() 一定返回 Activity 吗?

目录 1. 问题分析 1.1 Context 有哪些? 首先,我们回顾一下 Context 以及它的子类,在之前的这篇文章里,我们曾经讨论过:《Android | 一个进程有多少个 Context 对象(答对的不多)》。简单来说&a…

HTML5 canvas 参考手册

HTML5 <canvas> 参考手册 描述 HTML5 <canvas> 标签用于绘制图像&#xff08;通过脚本&#xff0c;通常是 JavaScript&#xff09;。 不过&#xff0c;<canvas> 元素本身并没有绘制能力&#xff08;它仅仅是图形的容器&#xff09; - 您必须使用脚本来完成实…

Unix/Linux编程:getcontext、setcontext

ucontext该结构提供了所谓的用户上下文信息&#xff0c;用于描述调用信号处理器函数前的进程状态&#xff0c;其中包括上一个进程信号掩码以及寄存器的保存值&#xff0c;例如程序计数器&#xff08;cp&#xff09;和栈指针寄存器&#xff08;sp&#xff09;&#xff0c;使用结…

Andriod getContext和getActivity

原创文章&#xff0c;如有转载&#xff0c;请注明出处&#xff1a;http://blog.csdn.net/myth13141314/article/details/62045162 MainActivity.this&#xff1a;表示MainActivity对象&#xff0c;一般用在内部类中指示外面的this&#xff0c;如果在内部类直接用this&#xff…

岭回归模型|机器学习|回归算法

目录 1.岭回归模型1.1背景1.2损失函数 2.相关代码2.1RidgeRegression类2.2求解代码2.3绘图代码 3.直接调库使用 1.岭回归模型 1.1背景 对于回归问题来说&#xff0c;它们的基本内容基本上都是相同的&#xff0c;所以岭回归模型与线性回归模型类似&#xff1a; y θ 0 x 0 …

机器学习学习笔记(13)----岭回归(Ridge回归)

在《机器学习学习笔记&#xff08;4&#xff09;----线性回归的数学解析》&#xff0c;我们通过计算线性模型的损失函数的梯度&#xff0c;得到使得损失函数为最小值的的解析解&#xff0c;被称之为普通最小二乘法&#xff1a; (1) 公式(1)能够求得的前提是是满秩矩阵&#xf…

Python机器学习教程—岭回归的原理和实现

在某些场景下&#xff0c;线性回归无法给出一个效果好的预测模型&#xff0c;那么就需要使用线性回归的升级版&#xff0c;去面对更复杂的应用场景&#xff0c;本文所记录的岭回归便是线性回归的一个升级版。 目录 强势样本对模型的影响 实例 岭回归定义 岭回归的实现 岭…

岭回归和Lasso回归

偏差和方差 机器学习算法针对特定数据所训练出来的模型并非是十全十美的&#xff0c;再加上数据本身的复杂性&#xff0c;误差不可避免。说到误差&#xff0c;就必须考虑其来源&#xff1a;模型误差 偏差&#xff08;Bias&#xff09; 方差&#xff08;Variance&#xff09; …

基于Python的岭回归模型

本文是使用Python进行岭回归模型分析&#xff0c;消除多重共线性 一、岭回归原理 自变量之间存在多重共线性&#xff0c;当时&#xff0c;加上一个正的常数矩阵(K>0)&#xff0c;岭回归估计定义公式&#xff1a; &#xff08;k为岭参数&#xff09; 的奇异程度比奇异程度小&…

用SPSS进行岭回归分析

打开SPSS将数据输入到SPSS中。 点击左上角文件->新建->语法 输入 * Encoding: UTF-8. INCLUDE D:\Program Files\IBM\SPSS\Statistics\27\Samples\Simplified Chinese\Ridge regression.sps. ridgereg enter x1 x2 x3 x4 x5 x6 x7 x8 x9 x10/depy.include内容需要自己寻找…

R语言与岭回归

岭参数的一般选择原则 选择k&#xff08;或lambda&#xff09;值&#xff0c;使得&#xff1a;各回归系数的岭估计基本稳定用最小二乘估计时符号不合理的回归系数&#xff0c;其岭回归的符号变得合理回归系数没有不合乎实际意义的绝对值残差平方和增大的不多 用R语言进行岭回归…

岭回归(Ridge Regression)及实现

岭回归(Ridge Regression)及实现 https://blog.csdn.net/google19890102/article/details/27228279 一、一般线性回归遇到的问题 在处理复杂的数据的回归问题时&#xff0c;普通的线性回归会遇到一些问题&#xff0c;主要表现在&#xff1a; 在处理复杂的数据的回归问题时&…

岭回归(R语言)

代码实现如下&#xff1a; data3.3<-read.csv("C:/Users/Administrator/Desktop/data3.3.csv",headTRUE) datas<-data.frame(scale(data3.3[,1:6])) # 对样本数据进行标准化处理并转换为数据框的存储格式 library(MASS) ridge3.3<-lm.ridge(y~.-1,datas,l…

多元线性回归-岭回归

目录 1.精确相关关系 2.高度相关关系 3.多重共线性与相关性 4.岭回归 5.linear_model.Ridge 5.1.案例1&#xff1a;加利福尼亚房屋价值数据 5.2.案例2:波士顿房价数据集 6.选取最佳正则化参数取值 1.精确相关关系 精确相关关系&#xff0c;即完全相关。如矩阵A并不是满…

回归——岭回归

1、作用 岭回归是一种专用于共线性数据分析的有偏估计回归方法&#xff0c;实质上是一种改良的最小二乘估计法&#xff0c;通过放弃最小二乘法的无偏性&#xff0c;以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法&#xff0c;对病态数据的拟合要强…

【机器学习04】岭回归

4 岭回归 4.1 简介 普通线性回归模型使用基于梯度下降的最小二乘法&#xff0c;在最小化损失函数的前提下&#xff0c;寻找最优模型参数&#xff0c;在此过程中&#xff0c;包括少数异常样本在内的全部训练数据都会对最终模型参数造成程度相等的影响&#xff0c;异常值对模型…