FFmpeg: FFmepg中的sws_scale() 函数分析

FFmpeg中的 sws_scale() 函数主要是用来做视频像素格式和分辨率的转换,其优势在于:可以在同一个函数里实现:1.图像色彩空间转换, 2:分辨率缩放,3:前后图像滤波处理。不足之处在于:效率相对较低,不如libyuv或shader,其关联的函数主要有:

1.sws_getContext():

struct SwsContext *sws_getContext(int srcW, /* 输入图像的宽度 */int srcH, /* 输入图像的宽度 */enum AVPixelFormat srcFormat, /* 输入图像的像素格式 */int dstW, /* 输出图像的宽度 */int dstH, /* 输出图像的高度 */enum AVPixelFormat dstFormat, /* 输出图像的像素格式 */int flags,/* 选择缩放算法(只有当输入输出图像大小不同时有效),一般选择SWS_FAST_BILINEAR */SwsFilter *srcFilter, /* 输入图像的滤波器信息, 若不需要传NULL */SwsFilter *dstFilter, /* 输出图像的滤波器信息, 若不需要传NULL */const double *param /* 特定缩放算法需要的参数(?),默认为NULL */);

与其类似的函数还有: sws_getCachedContext ,区别在于: sws_getContext 可以用于多路码流转换,为每个不同的码流都指定一个不同的转换上下文,而 sws_getCachedContext 只能用于一路码流转换。

2.sws_freeContext

// 释放sws_scale
void sws_freeContext(struct SwsContext *swsContext);

真正用来做转换的函数则是:sws_scale(), 其函数定义如下:

int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],const int srcStride[], int srcSliceY, int srcSliceH,uint8_t *const dst[], const int dstStride[]);

下面对其函数参数进行详细说明:

1.参数 SwsContext *c, 转换格式的上下文。也就是 sws_getContext 函数返回的结果。
2.参数 const uint8_t *const srcSlice[], 输入图像的每个颜色通道的数据指针。其实就是解码后的AVFrame中的data[]数组。因为不同像素的存储格式不同,所以srcSlice[]维数
也有可能不同。
以YUV420P为例,它是planar格式,它的内存中的排布如下:
YYYYYYYY UUUU VVVV
使用FFmpeg解码后存储在AVFrame的data[]数组中时:
data[0]——-Y分量, Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8……
data[1]——-U分量, U1, U2, U3, U4……
data[2]——-V分量, V1, V2, V3, V4……
linesize[]数组中保存的是对应通道的数据宽度 ,
linesize[0]——-Y分量的宽度
linesize[1]——-U分量的宽度
linesize[2]——-V分量的宽度

而RGB24,它是packed格式,它在data[]数组中则只有一维,它在存储方式如下:
data[0]: R1, G1, B1, R2, G2, B2, R3, G3, B3, R4, G4, B4……
这里要特别注意,linesize[0]的值并不一定等于图片的宽度,有时候为了对齐各解码器的CPU,实际尺寸会大于图片的宽度,这点在我们编程时(比如OpengGL硬件转换/渲染)要特别注意,否则解码出来的图像会异常。

3.参数const int srcStride[],输入图像的每个颜色通道的跨度。.也就是每个通道的行字节数,对应的是解码后的AVFrame中的linesize[]数组。根据它可以确立下一行的起始位置,不过stride和width不一定相同,这是因为:
a.由于数据帧存储的对齐,有可能会向每行后面增加一些填充字节这样 stride = width + N;
b.packet色彩空间下,每个像素几个通道数据混合在一起,例如RGB24,每个像素3字节连续存放,因此下一行的位置需要跳过3*width字节。

4.参数int srcSliceY, int srcSliceH,定义在输入图像上处理区域,srcSliceY是起始位置,srcSliceH是处理多少行。如果srcSliceY=0,srcSliceH=height,表示一次性处理完整个图像。这种设置是为了多线程并行,例如可以创建两个线程,第一个线程处理 [0, h/2-1]行,第二个线程处理 [h/2, h-1]行。并行处理加快速度。
5.参数uint8_t *const dst[], const int dstStride[]定义输出图像信息(输出的每个颜色通道数据指针,每个颜色通道行字节数)

代码示例:将解码后的数据转换成1280*720的RGBA8888 格式

1. 定义转换格式的上下文

vctx = sws_getCachedContext(vctx,frame->width, // 源图像的宽度frame->height, //  源图像的高度(AVPixelFormat)frame->format,outWidth,outHeight,AV_PIX_FMT_RGBA,SWS_FAST_BILINEAR,0, 0, 0);

2. 开始转换

int outWidth = 1280;
int outHeight = 720;
char *rgb = new char[1920*1080*4];
uint8_t *data[AV_NUM_DATA_POINTERS] = {0};data[0] = (uint8_t *)rgb;int lines[AV_NUM_DATA_POINTERS] = {0};lines[0] = outWidth * 4;int h = sws_scale(vctx,(const uint8_t **)frame->data,frame->linesize,0,frame->height,data,lines);

参考链接:

1.sws_scale概念讲解

2.FFmpeg视频解码中的YUV420P格式

原文链接:https://www.cnblogs.com/yongdaimi/p/10715830.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863100.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.2 可压缩流:激波和膨胀扇

1.2 可压缩流:激波和膨胀扇 前言 欢迎观看《Bang Dream! Ave mujica》,一部超好看的少女乐队动漫,从2025.1.2开始,每周四晚10点更新。 哇嘎利马斯 大量玩梗注意 AA笔记主要参考刘永学主编《空气动力学》,讲的物理概念很清晰易懂,推荐给大家。 扰动的传播 接下来我们讨论扰…

使用ClosedXML实现Excel导入导出

使用ClosedXML实现Excel导入导出 写在开头 游览Dotnet 基金会中的项目时,发现了这个库,Github 链接,它的性能非常好,详细见下图话不多说,直接上代码吧! 导出 后端: public static byte[] Output<T>(List<T> data, string sheetName) {using var workbook = …

离线环境一步部署OCR文字识别程序

前言 百度、阿里等的OCR接口需要联网环境,并且超过免费/试用次数后需要付费。一般政务项目因为信息安全要求都部署在独立内网,有没有离线免费的OCR实现方案?下文基于EasyOCR实现一步部署,可下载直接使用。 EasyOCR EasyOCR支持离线部署,可免费使用(支持Apache-2.0 licens…

昆明理工大学25届MBA复试资料

昆明理工大学25届MBA复试资料介绍 昆明理工大学MBA工商管理考研复试群:679724235 作者:唐维康 QQ1352517362 包含内容 全部内容如下:01、往年面试真题分为了专业知识问答、英语口语、社会类问题、综合面试问题四类,为去年上岸的面试题。02、专业英语词汇05、MBA复试1V1辅导课…

Alexander ——2024年报

Alexander ——2024年报Alexander ——2024年报 小总结 知己知彼,百战不殆。2024下半年找到了自己学习的方向,也认识很多的师傅,深入领域学习,无时不刻不在CTF的路上,逐渐建立一个完整的知识库体系。 今年的成长变化与进步 所学习的知识 Misc大部分编码体制皮亚诺夫曲线,希伯…

2025 多校冲刺省选模拟赛 1

第一次!输输输!2025 多校冲刺省选模拟赛 1 切割蛋糕(cake) 签到题 本质上是求 \(a\) 序列最小满足所有前缀平均值均大于全局平均值的循环位移,考虑 Raney 引理,找到斜率 \(\dfrac{s}{n}\) 所经过截距最小的点,易知没有无解情况。 时间复杂度 \(O(n)\)。 游乐园(park) …

IntelliJ IDEA 2024 安装激活详细使用教程(激活至2026,实测是永久,亲测!)

开发工具推荐:IntelliJ IDEA 2024 安装激活详细使用教程(激活至2026,实际上永久,亲测!)申明:本教程 IntelliJ IDEA补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !卸载老版本 IDEA 首先,如果小伙伴的…

文件及文件夹的对比工具:Beyond Compare v5.0修改版(无需手动激活)

前言 Beyond Compare是一款文件及文件夹(目录)的对比工具。Beyond Compare不仅可以快速比较出两个目录的不同,还可以比较每个文件的内容,而且可以任意显示比较结果。Beyond Compare程序内建了文件浏览器,方便您对文件、文件夹、压缩包、FTP网站之间的差异比对以及资料同步…

LGV 引理

无。LGV 引理 概述 参考 OI Wiki Lindstrm–Gessel–Viennot lemma,即 LGV 引理,可以用来处理有向无环图上不相交路径计数等问题。 引理定义方阵 \(M\)。结论是: \[\det(M) = \sum_{S:A\to B} (-1)^{sgn(\sigma(S))} \prod_{i=1}^n \omega(S_i) \]其中 \(S:A\to B\) 表示不相…

【python复习随记】

缩进要对多行语句:使用反斜杠\ total = item_one + \item_two + \item_three在 [], {}, 或 () 中的多行语句,不需要使用反斜杠 \ total = [item_one, item_two, item_three,item_four, item_five]复数complex a+bj : a实部 b虚部 j虚数单位 字符串 (1)多行字符串:三引号( …

windows11连接蓝牙耳机声音差的解决方案

前期在使用Windows 10时,我的XM3通常是有Hands Free和正常输出两个通道的,走Hands Free通道则会触发通话模式,可以自己调整以适应不同的需求。 但是升级到Windows 11后,发现只剩下了一个耳机输出通道,但是音质直接降为通话音质,多次升降级无果,调整音质选项也没有作用。…

【政策解读】《电力监控系统安全防护规定》今日施行!

《电力监控系统安全防护规定》旨在提升电力监控系统的安全性和可靠性,确保电力系统的安全稳定运行。今日起施行,主要内容: 1、总则:《电力监控系统安全防护规定》旨在强化电力监控系统安全防护,保障电力系统安全稳定运行。规定适用于中国境内的电力监控系统运营者及相关单…