FFmpeg调用sws_scale_frame报错“Slice Parameters 0,1080无效”求助
问题分析与修复方案
核心错误原因
- 缩放目标帧未分配内存:仅设置
scaled_frame的format、width、height,但未为帧像素数据分配缓冲区,sws_scale_frame无法写入缩放后的数据,触发参数错误。 - 编码器上下文尺寸不匹配:
prepare_video_encoder中把编码器宽高设为解码器的原1080p尺寸,与目标480p输出尺寸冲突,后续编码也会出错。 - 缩放上下文硬编码源尺寸:固定写死1920x1080作为源尺寸,若输入视频不是该分辨率会直接失效,应动态从解码器上下文获取。
具体修复步骤
1. 修正编码器上下文的尺寸设置
在prepare_video_encoder函数中,将编码器宽高改为目标缩放尺寸:
// 替换原decoder_ctx->width/height的赋值 encoder_sc->video_avcc->height = 480; encoder_sc->video_avcc->width = 854;
2. 动态设置缩放上下文的源尺寸
修改sws_getContext的源宽高,从解码器上下文动态获取,避免硬编码:
encoder_sc->sws_ctx = sws_getContext(decoder_ctx->width, decoder_ctx->height, decoder_ctx->pix_fmt, 854, 480, encoder_sc->video_avcc->pix_fmt, SWS_BICUBIC, NULL, NULL, NULL );
3. 为缩放目标帧分配内存
在调用sws_scale_frame前,必须为scaled_frame分配像素缓冲区,修改transcode_video函数对应代码:
if (response >= 0) { scaled_frame->format = encoder->video_avcc->pix_fmt; scaled_frame->width = 854; scaled_frame->height = 480; scaled_frame->time_base = input_frame->time_base; // 同步时间基,避免时序错误 // 为缩放帧分配内存,失败则报错 int ret = av_frame_get_buffer(scaled_frame, 0); if (ret < 0) { logging("Failed to allocate buffer for scaled frame: %s", av_err2str(ret)); return ret; } sws_scale_frame(encoder->sws_ctx, scaled_frame, input_frame); if (encode_video(decoder, encoder, scaled_frame)) return -1; av_frame_unref(scaled_frame); // 使用后释放引用 }
4. 修正错误的调用逻辑
你提到的sws_scale_frame(encoder->sws_ctx, input_frame, input_frame);是将输入帧同时作为输出,会覆盖原帧且尺寸不匹配,必须使用单独的scaled_frame作为输出参数,保持你完整代码中的正确写法。
额外注意事项
- 确保
scaled_frame是通过av_frame_alloc()初始化的,禁止使用未初始化的指针。 - 检查
encode_video函数是否适配854x480的帧尺寸,避免编码器收到不匹配的帧数据。
内容的提问来源于stack exchange,提问作者user16570427
相关产品推荐
相关产品推荐

