sws_scale 到底在干嘛?—— FFmpeg libswscale 最细参数说明书
目录一、先给一句话定性二、sws_scale 函数原型三、参数逐个拆解① struct SwsContext *c是什么flags 常见值必须知道② const uint8_t *const srcSlice[]是什么合法值示例③ const int srcStride[]是什么为什么不等于 width * bpp④ int srcSliceY官方语义现实情况⑤ int srcSliceH是什么⑥ uint8_t *const dst[]是什么玩法 AAVFrame 接住玩法 B自己 malloc⑦ const int dstStride[]最常见翻车点正确示例RGB32YUV420P 输出四、使用示例五、90% 花屏 / 灰边 / 崩溃的真实原因六、colorspace / range 怎么塞进去七、一句话总结觉得有用就请您帮忙点赞转发收藏吧您的鼓励是我创作的动力多谢看官。由于能力水平有限文中的错误或不严谨的地方在所难免还请批评指正。sws_scale是 FFmpeg 多媒体框架中libswscale库的核心函数主要用于高效地执行‌图像像素格式转换‌、‌分辨率缩放‌以及‌图像滤波处理‌。它通常在视频解码后、渲染或编码前被调用将解码得到的原始帧数据如 YUV 格式转换为目标格式如 RGB 格式或调整尺寸。做播放器的人早晚都会遇到这一句sws_scale(sws_ctx, frame-data, frame-linesize, 0, frame-height, dst-data, dst-linesize);抄能用但一问为什么传 linesize为什么 srcSliceY 永远是 0dstStride 能不能乱填​今天就把它拆干净。一、先给一句话定性sws_scale 不是“画图函数”是像素搬运工负责 YUV↔RGB / resize / colorspace / range 全部打包干完。核心任务只有两件格式转换Pixel Format几何缩放Scale二、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[]);看着吓人其实分组很好记上下文 src 数据 / 步长 裁剪区域 dst 数据 / 步长三、参数逐个拆解①struct SwsContext *c是什么一次初始化终身干活直到分辨率/格式变由这个函数产出的struct SwsContext *sws_ctx sws_getContext( src_w, src_h, src_fmt, dst_w, dst_h, dst_fmt, SWS_BILINEAR, NULL, NULL, NULL );flags 常见值必须知道flag中文用在哪里SWS_FAST_BILINEAR快双线性播放器首选SWS_BILINEAR双线性质量稍好SWS_BICUBIC立方放大好看SWS_POINT最近邻截图 / 调试SWS_LANCZOS锐缩图强迫症SWS_AREA均值缩得很小实时播放器结论1080p↓SWS_FAST_BILINEAR放大预览BICUBIC②const uint8_t *const srcSlice[]是什么AVFrame-data 原样传srcSlice frame-data;合法值示例格式srcSlice 含义YUV420P{data[0], data[1], data[2]}NV12{data[0], data[1]}RGB24{data[0]}RGBA{data[0]}别传 AVFrame传它的 data*③const int srcStride[]是什么每一平面的“行跨度bytes per line”srcStride frame-linesize;为什么不等于 width * bppCPU 对齐32 / 64GPU / SIMD 友好例1280×720 yuv420plinesize[0] 1280 Y linesize[1] 640 U linesize[2] 640 V但 1278 宽可能变成linesize[0] 1280 ← paddingsws_scale 靠 stride 找下一行❌ 自己算 stride 花屏之源④int srcSliceY官方语义从第几行开始处理切片现实情况srcSliceY 0; // 99% 情况什么时候不是 0多线程切条处理 slice古老优化超大图分段 scale现在没人这么干 记住播放器永远传 0⑤int srcSliceH是什么要处理的行数正确写法srcSliceH frame-height;别写 dst_h / coded_height⑥uint8_t *const dst[]是什么输出缓冲区两种玩法玩法 AAVFrame 接住av_frame_get_buffer(dst_frame, 32); dst dst_frame-data;玩法 B自己 mallocuint8_t* rgb new uint8_t[w*h*4]; uint8_t* out[1] { rgb };注意对齐推荐av_malloc()⑦const int dstStride[]最常见翻车点正确示例RGB32int dst_stride dst_w * 4; uint8_t* out[1] { buf }; int stride[1] { dst_stride };YUV420P 输出int dst_linesize[3] { dst_w, dst_w / 2, dst_w / 2 };sws_scale 不帮你 alloc也不帮你猜 stride四、使用示例SwsContext* sws sws_getContext( dec_frame-width, dec_frame-height, (AVPixelFormat)dec_frame-format, dst_w, dst_h, AV_PIX_FMT_RGB24, SWS_FAST_BILINEAR, nullptr, nullptr, nullptr ); uint8_t* rgb (uint8_t*)av_malloc(dst_w * dst_h * 3); uint8_t* out[] { rgb }; int dst_stride[] { dst_w * 3 }; sws_scale(sws, dec_frame-data, dec_frame-linesize, 0, dec_frame-height, out, dst_stride);五、90% 花屏 / 灰边 / 崩溃的真实原因症状真凶右边彩色条纹dstStride ≠ width*bpp上下错位srcSliceH 传错颜色发绿pixfmt 传 AV_PIX_FMT_YUV420 → YUVJ420P缩放糊flag 用 POINT内存越界dst buffer 没算 padding六、colorspace / range 怎么塞进去sws_scale只看像素布局不认 color_range / primaries。高级玩家这样玩sws_setColorspaceDetails( sws, sws_getCoefficients(AVCOL_SPC_BT709), 1, // src_range (0full) sws_getCoefficients(AVCOL_SPC_BT709), 1, // dst_range 0, 116, 116 );不然 YUV→RGB 永远“差点味”七、一句话总结sws_scale src/data/linesize dst/data/linesize 裁剪从 0 到 height永远用 AVFrame 的 linesize别自己算flags 别瞎选。

相关新闻

校园二手交易与租赁系统开发实战

校园二手交易与租赁系统开发实战

1. 项目概述校园物品租赁与二手交易系统是当前高校场景下的刚需应用。作为一名在校园信息化领域深耕多年的开发者,我发现学生们经常面临这样的困境:想租个相机记录毕业季却找不到渠道,闲置的教材和电子产品只能低价贱卖,自行车等大…

2026/10/18 22:21:26 阅读更多 →
LearnOpenGL之Shader编程——生成设计

LearnOpenGL之Shader编程——生成设计

———————————————————— 前序 ——————————————————— AndroidLearnOpenGL是本博主自己实现的LearnOpenGL练习集合: Github地址:GitHub - wangyongyao1989/AndroidLearnOpenGL: OpenGL基础及运用 系列文章&#xff…

2026/10/19 0:30:14 阅读更多 →
校园物品租赁与二手交易系统开发实践

校园物品租赁与二手交易系统开发实践

1. 项目背景与核心价值校园物品租赁与二手交易系统是当前高校场景下的刚需应用。每到学期初和毕业季,教材、自行车、体育器材等物品的流转需求就会集中爆发。传统线下交易方式存在信息不对称、交易效率低、信任成本高等痛点。我们团队开发的这款微信小程序&#xff…

2026/10/18 23:14:30 阅读更多 →

最新新闻

UFCS融合快充迎里程碑:33款芯片过检,快充生态走向统一

UFCS融合快充迎里程碑:33款芯片过检,快充生态走向统一

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:07:34 阅读更多 →
STM32 CAN总线实战:从物理层到协议栈的深度解析

STM32 CAN总线实战:从物理层到协议栈的深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:07:34 阅读更多 →
RK3528嵌入式直播全栈方案:硬编硬解+AI绿幕+六协议共存

RK3528嵌入式直播全栈方案:硬编硬解+AI绿幕+六协议共存

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:07:34 阅读更多 →
STM32+华为云IoT+Qt:跨平台智能家居控制系统全链路实战

STM32+华为云IoT+Qt:跨平台智能家居控制系统全链路实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:07:34 阅读更多 →
ESP32-S31 Windows一键烧录包制作指南:从镜像合并到脚本落地

ESP32-S31 Windows一键烧录包制作指南:从镜像合并到脚本落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:07:34 阅读更多 →
28Gbps无源互连损耗机制与高性价比结构设计

28Gbps无源互连损耗机制与高性价比结构设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:06:33 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →