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/8/9 19:13:45 阅读更多 →
LearnOpenGL之Shader编程——生成设计

LearnOpenGL之Shader编程——生成设计

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

2026/8/9 19:13:45 阅读更多 →
校园物品租赁与二手交易系统开发实践

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

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

2026/8/9 19:13:45 阅读更多 →

最新新闻

别再把权限写进提示词:Agent 外部控制面的可运行设计

别再把权限写进提示词:Agent 外部控制面的可运行设计

8月的智能体安全新闻里,最值得工程团队警惕的变化,不是又多了一个提示词注入案例。 真正变化是,攻击者开始绕过模型回答,直接借智能体的工具、身份与网络出口完成动作。 当一个 Agent 既能读不可信网页,又能调用 MCP、写配置、连内部系统时,提示词里的“不要做坏事”已…

2026/8/9 20:10:14 阅读更多 →
从单一到多维:ECharts多坐标系组合的终极指南

从单一到多维:ECharts多坐标系组合的终极指南

从单一到多维:ECharts多坐标系组合的终极指南 【免费下载链接】echarts Apache ECharts is a powerful, interactive charting and data visualization library for browser 项目地址: https://gitcode.com/GitHub_Trending/echa/echarts 在数据可视化领域&a…

2026/8/9 20:10:14 阅读更多 →
【AAAI 2026】ReconVLA:以重建式视觉监督实现精准机器人操纵|从机器人视觉表征对齐视角

【AAAI 2026】ReconVLA:以重建式视觉监督实现精准机器人操纵|从机器人视觉表征对齐视角

摘要 本文解读 AAAI 2026 论文《ReconVLA: Reconstructive Vision-Language-Action Model as Effective Robot Perceiver》。该论文提出 ReconVLA,一个以重建式视觉监督实现隐式 grounding 的视觉-语言-动作(VLA)模型,通过融合注…

2026/8/9 20:10:14 阅读更多 →
基于Ollama与本地大模型的私有化文本摘要系统构建指南

基于Ollama与本地大模型的私有化文本摘要系统构建指南

1. 项目概述:为什么离线摘要生成是AI应用开发的必修课最近跟几个做前端和后端开发的朋友聊天,发现一个挺有意思的现象:大家或多或少都接触过AI,但一提到“离线”、“私有化部署”这些词,第一反应往往是“复杂”、“性能…

2026/8/9 20:10:14 阅读更多 →
C/C++函数返回机制:值、引用与指针的性能与陷阱

C/C++函数返回机制:值、引用与指针的性能与陷阱

1. C/C函数返回机制深度解析在C/C开发中,函数返回值的处理方式直接影响程序性能、内存安全和代码可维护性。三种主要返回方式各有其适用场景和陷阱,理解它们的底层原理是写出高质量代码的基础。1.1 值返回的本质与开销值返回(Return by Value…

2026/8/9 20:10:14 阅读更多 →
浏览器内ADB调试:Tango如何革新Android开发体验

浏览器内ADB调试:Tango如何革新Android开发体验

浏览器内ADB调试:Tango如何革新Android开发体验 【免费下载链接】ya-webadb ADB in your browser 项目地址: https://gitcode.com/gh_mirrors/ya/ya-webadb 你是否曾为Android开发调试的繁琐环境配置而烦恼?传统ADB客户端需要复杂的本地环境设置&…

2026/8/9 20:09:14 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/9 17:05:02 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/9 17:05:02 阅读更多 →