如果AVFrame是YUV420P格式,你可以先将其转换为BGR格式,然后再使用OpenCV保存。下面是一个示例代码:
#include <opencv2/opencv.hpp>
extern "C" {
#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>
}
void saveAVFrame(AVFrame *frame, const char *filename) {
// 创建一个与AVFrame宽高相匹配的OpenCV Mat对象
cv::Mat image(frame->height, frame->width, CV_8UC3);
// 创建SwsContext进行图像格式转换
SwsContext* sws_ctx = sws_getContext(frame->width, frame->height, AV_PIX_FMT_YUV420P,
frame->width, frame->height, AV_PIX_FMT_BGR24,
0, nullptr, nullptr, nullptr);
// 转换并保存图像
uint8_t* dest_data[1] = { image.data };
int dest_linesize[1] = { static_cast<int>(image.step[0]) };
sws_scale(sws_ctx, frame->data, frame->linesize, 0, frame->height,
dest_data, dest_linesize);
// 释放SwsContext内存
sws_freeContext(sws_ctx);
// 保存图像到文件
cv::imwrite(filename, image);
}
请确保已经正确链接了FFmpeg和OpenCV库,并且包含了相应的头文件。调用saveAVFrame
函数,传入YUV420P格式的AVFrame指针和要保存的文件名,即可实现将AVFrame保存为图像文件。
内容由零声教学AI助手提供,问题来源于学员提问