【发布时间】:2019-01-10 01:14:47
【问题描述】:
我的代码有问题。
我想将 YUV 转换为 RGB,但sws_scale 总是返回 0 并且数据填充为 00000000..NULL
我尝试用谷歌搜索,但找不到任何问题。
我需要 AVPicture 还是 QImage?谁能指出我的问题?
pVFrame = av_frame_alloc();
while (av_read_frame(pFormatCtx, &packet) == 0) {
if (packet.stream_index == VSI) {
if (bool res = avcodec_send_packet(pVideoCodecCtx, &packet)) {
printf("avcodec_send_packet failed %d %d %d\n", res, AVERROR(EINVAL), AVERROR(ENOMEM));
}
avcodec_receive_frame(pVideoCodecCtx, pVFrame);
AVFrame* YUV_frame = Con_yuv_YUV420P(pVFrame);
QFrame->push(Con_yuv_RGB(YUV_frame));
}
}
}
AVFrame* Con_yuv_RGB(AVFrame* YUV_frame)
{
AVFrame* RGBFrame = av_frame_alloc();
SwsContext* sws_Context = NULL;
sws_Context = sws_getCachedContext(sws_Context, YUV_frame->width, YUV_frame->height, pVideoCodecCtx->pix_fmt,
YUV_frame->width, YUV_frame->height, AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);
if (sws_Context == NULL) {
return false;
}
result = sws_scale(sws_Context, YUV_frame->data, YUV_frame->linesize, 0, (int)YUV_frame->height, RGBFrame->data, RGBFrame->linesize);
if (result < 0)
{
return false;
}
av_frame_unref(YUV_frame);
if (RGBFrame == NULL) {
av_frame_unref(RGBFrame);
return false;
}
sws_freeContext(sws_Context);
return RGBFrame;
有什么问题?
参考链接-https://gist.github.com/nakaly/11eb992ebd134ee08b75e4c67afb5703,
http://codefromabove.com/2014/10/ffmpeg-convert-rgba-to-yuv/,
sws_scale YUV --> RGB distorted image,
https://www.gamedev.net/forums/topic/464977-sws_scale-problems/
https://ffmpeg.org/doxygen/2.7/group__libsws.html#gae531c9754c9205d90ad6800015046d74
添加: enter image description here
转换前。它必须填满缓冲区。
RGBFrame->width = YUV_frame->width; RGBFrame->format = AV_PIX_FMT_RGB32;
RGBFrame->height = YUV_frame->height;
int result = av_frame_get_buffer(RGBFrame, 32);
if (result != 0) return false;
【问题讨论】:
标签: c++ ffmpeg yuv libavcodec