You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg调用sws_scale_frame报错“Slice Parameters 0,1080无效”求助

问题分析与修复方案

核心错误原因

  1. 缩放目标帧未分配内存:仅设置scaled_frame的format、width、height,但未为帧像素数据分配缓冲区,sws_scale_frame无法写入缩放后的数据,触发参数错误。
  2. 编码器上下文尺寸不匹配:prepare_video_encoder中把编码器宽高设为解码器的原1080p尺寸,与目标480p输出尺寸冲突,后续编码也会出错。
  3. 缩放上下文硬编码源尺寸:固定写死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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:25:02