FFmpeg 解码和转换 RGB sws_scale 错误
FFmpeg decode and convert RGB sws_scale error
我的代码有问题。
我想将 YUV 转换为 RGB,但是 sws_scale
returns 始终为 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;
有什么问题?
enter image description here
参考 link - 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;
ffmpeg 文档涵盖了它:
https://www.ffmpeg.org/doxygen/2.3/group__lavu__frame.html#gac700017c5270c79c1e1befdeeb008b2f
AVFrame* av_frame_alloc ( void )
Allocate an AVFrame and set its fields to default values.
The resulting struct must be freed using av_frame_free().
Returns An AVFrame filled with default values or NULL on failure. Note
this only allocates the AVFrame itself, not the data buffers. Those
must be allocated through other means, e.g. with av_frame_get_buffer()
or manually.
https://www.ffmpeg.org/doxygen/2.3/group__lavu__frame.html#ga6b1acbfa82c79bf7fd78d868572f0ceb
int av_frame_get_buffer ( AVFrame * frame, int align ) Allocate
new buffer(s) for audio or video data.
The following fields must be set on frame before calling this
function:
format (pixel format for video, sample format for audio) width and
height for video nb_samples and channel_layout for audio This function
will fill AVFrame.data and AVFrame.buf arrays and, if necessary,
allocate and fill AVFrame.extended_data and AVFrame.extended_buf. For
planar formats, one buffer will be allocated for each plane.
我的代码有问题。
我想将 YUV 转换为 RGB,但是 sws_scale
returns 始终为 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;
有什么问题?
enter image description here
参考 link - 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;
ffmpeg 文档涵盖了它:
https://www.ffmpeg.org/doxygen/2.3/group__lavu__frame.html#gac700017c5270c79c1e1befdeeb008b2f
AVFrame* av_frame_alloc ( void )
Allocate an AVFrame and set its fields to default values.
The resulting struct must be freed using av_frame_free().
Returns An AVFrame filled with default values or NULL on failure. Note this only allocates the AVFrame itself, not the data buffers. Those must be allocated through other means, e.g. with av_frame_get_buffer() or manually.
https://www.ffmpeg.org/doxygen/2.3/group__lavu__frame.html#ga6b1acbfa82c79bf7fd78d868572f0ceb
int av_frame_get_buffer ( AVFrame * frame, int align ) Allocate new buffer(s) for audio or video data.
The following fields must be set on frame before calling this function:
format (pixel format for video, sample format for audio) width and height for video nb_samples and channel_layout for audio This function will fill AVFrame.data and AVFrame.buf arrays and, if necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. For planar formats, one buffer will be allocated for each plane.