видео — ffmpeg sws_scale YUV420p для RGBA не дает правильного результата масштабирования (c ++)

Я пытаюсь масштабировать декодированный кадр YUV420p (1018×700) с помощью sws_scale в RGBA, я сохраняю данные в необработанный видеофайл и затем воспроизводю необработанное видео с помощью ffplay, чтобы увидеть результат.

Вот мой код:

sws_ctx = sws_getContext(video_dec_ctx->width, video_dec_ctx->height,AV_PIX_FMT_YUV420P, video_dec_ctx->width, video_dec_ctx->height, AV_PIX_FMT_BGR32, SWS_LANCZOS | SWS_ACCURATE_RND, 0, 0, 0);
ret = avcodec_decode_video2(video_dec_ctx, yuvframe, got_frame, &pkt);
if (ret < 0) {
std::cout<<"Error in decoding"<<std::endl;
return ret;
}else{
//the source and destination heights and widths are the same
int sourceX = video_dec_ctx->width;
int sourceY = video_dec_ctx->height;
int destX = video_dec_ctx->width;
int destY = video_dec_ctx->height;

//declare destination frame
AVFrame avFrameRGB;
avFrameRGB.linesize[0] = destX * 4;
avFrameRGB.data[0] = (uint8_t*)malloc(avFrameRGB.linesize[0] * destY);

//scale the frame to avFrameRGB
sws_scale(sws_ctx, yuvframe->data, yuvframe->linesize, 0, yuvframe->height, avFrameRGB.data, avFrameRGB.linesize);

//write to file
fwrite(avFrameRGB.data[0], 1, video_dst_bufsize, video_dst_file);
}

Вот результат без масштабирования (т.е. в формате YUV420p)
Вот результат без масштабирования (т.е. в формате YUV420p)

Вот масштабирование после воспроизведения с использованием ffplay (т.е. в формате RGBA)
введите описание изображения здесь

Я запускаю ffplay с помощью следующей команды («video» — это необработанный видеофайл)

ffplay -f rawvideo -pix_fmt bgr32 -video_size 1018x700 video

Что я должен исправить, чтобы обеспечить правильное масштабирование с RGB32?

1

Решение

Я нашел решение, проблема была в том, что я не использовал правильный размер буфера для записи в файл.

fwrite(avFrameRGB.data[0], 1, video_dst_bufsize, video_dst_file);

Переменная video_dst_file была взята из возвращаемого значения

video_dst_bufsize = av_image_alloc(yuvframe.data, yuvframe.linesize, destX, destY, AV_PIX_FMT_YUV420P, 1);

Решение состоит в том, чтобы получить возвращаемое значение и использовать его в выражении fwrite:

video_dst_bufsize_RGB = av_image_alloc(avFrameRGB.data, avFrameRGB.linesize, destX, destY, AV_PIX_FMT_BGR32, 1);

fwrite(avFrameRGB.data[0], 1, video_dst_bufsize_RGB, video_dst_file);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]