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】:
对于将来遇到此问题的任何人,我的问题是我没有正确初始化 pFrame
和 pFrameRGB
。首先必须使用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分析