ffmpeg sws_scale 上的分段错误

Posted

技术标签:

【中文标题】ffmpeg sws_scale 上的分段错误【英文标题】:Segmentation fault on ffmpeg sws_scale 【发布时间】:2017-04-03 00:53:22 【问题描述】:

我正在尝试使用 ffmpeg 的 sws_scale 函数将 AVFrame 从 JPEG(YUV 像素格式)转换为 RGB24 格式。我将 SwsContext 设置如下:

struct SwsContext *sws_ctx = NULL;
    int frameFinished;
    AVPacket packet;
    // initialize SWS context for software scaling
    sws_ctx = sws_getContext(pCodecCtx->width,
        pCodecCtx->height,
        pCodecCtx->pix_fmt,
        pCodecCtx->width,
        pCodecCtx->height,
        AV_PIX_FMT_RGB24,
        SWS_BICUBIC,
        NULL, NULL, NULL
        );

然后,我使用以下命令执行sws_scale

sws_scale(sws_ctx,
          (uint8_t const * const *)pFrame->data,
          pFrame->linesize,
          0,
          pCodecCtx->height,
          pFrameRGB->data,
          pFrameRGB->linesize);

这给了我一个段错误,虽然我不知道为什么。我尝试通过打印检查这些值以及高度和线条大小,所有内容似乎都有有效值。

【问题讨论】:

乍一看,一切似乎都是正确的。仔细检查pFrame->data 是否包含 3 个带有 YUV(420P?)数据的平面,pFrameRGB->linesize[0] 是否至少比 pCodecCtx->width 大 3 倍,以及 pFrameRGB->data 是否包含 1 个至少 pFrameRGB->linesize[0] * pCodecCtx->height 大的平面。如果一切正常,请查看在读取值或写入时是否发生段错误(至少您会知道它是源帧还是目标帧)。 【参考方案1】:

对于将来遇到此问题的任何人,我的问题是我没有正确初始化 pFramepFrameRGB。首先必须使用av_frame_alloc() 为帧结构分配内存,然后必须使用av_image_alloc() 分配数据缓冲区。

【讨论】:

你知道sws代表什么吗? @zanbri 恐怕我没有,对不起! 我认为的软件规模。

以上是关于ffmpeg sws_scale 上的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg源码简单分析:libswscale的sws_scale()

FFmpeg(10)-基于FFmpeg进行像素格式转换(sws_getCachedContext(), sws_scale())

ffmpeg中sws_scale和sws_getContext的api分析

sws_scale函数的用法-具体应用

使用sws_scale转换视频使用swr_convert转换音频

使用sws_scale转换视频使用swr_convert转换音频