libswscale中sws_scale_frame函数未找到及替代方案求助
问题解决思路
核心原因
你使用的libswscale版本是4.4.2,而sws_scale_frame()是FFmpeg 5.0版本之后才新增的API,4.x系列版本根本没有这个函数,所以会出现头文件无签名、链接时未定义引用的错误。
解决方案
方案1:使用旧版标准缩放函数sws_scale()(推荐)
这是4.x版本中官方支持的视频缩放接口,步骤如下:
- 首先调用
sws_getContext()创建缩放上下文,传入源帧和目标帧的宽高、像素格式等参数 - 调用
sws_scale()执行帧缩放操作 - 缩放完成后调用
sws_freeContext()释放上下文资源
示例代码片段:
// 假设src_frame是源1080p帧,dst_frame是初始化好的480p目标帧 SwsContext *sws_ctx = sws_getContext( src_frame->width, src_frame->height, src_frame->format, dst_frame->width, dst_frame->height, dst_frame->format, SWS_BILINEAR, NULL, NULL, NULL ); if (!sws_ctx) { // 处理上下文创建失败的情况 return -1; } // 执行缩放 sws_scale( sws_ctx, (const uint8_t *const *)src_frame->data, src_frame->linesize, 0, src_frame->height, dst_frame->data, dst_frame->linesize ); // 释放资源 sws_freeContext(sws_ctx);
方案2:升级libswscale到5.x及以上版本
如果一定要使用sws_scale_frame(),需要手动升级FFmpeg相关库:
- 可以通过第三方PPA(比如ppa:jonathonf/ffmpeg-5)安装新版,Ubuntu 22.04兼容该PPA
- 或者从FFmpeg官方源码编译安装最新版,编译时指定启用libswscale模块
不过升级可能会打破系统原有依赖,建议优先选择方案1。
内容的提问来源于stack exchange,提问作者user16570427
相关产品推荐
相关产品推荐

