取mat yuv数据填充avframe, 都是yuv格式
时间: 2024-05-12 08:20:51 浏览: 92
yuv数据格式
以下是使用FFmpeg库将Mat YUV数据填充到AVFrame的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <libavcodec/avcodec.h>
int main(int argc, char* argv[])
{
// 初始化FFmpeg库
avcodec_register_all();
AVCodec* codec = avcodec_find_decoder(AV_CODEC_ID_H264);
AVCodecContext* codec_ctx = avcodec_alloc_context3(codec);
avcodec_open2(codec_ctx, codec, NULL);
// 创建AVFrame对象
AVFrame* frame = av_frame_alloc();
frame->format = AV_PIX_FMT_YUV420P;
frame->width = 1920;
frame->height = 1080;
av_frame_get_buffer(frame, 32);
// 从Mat读取YUV数据
cv::Mat yuv_mat(1080 * 1.5, 1920, CV_8UC1);
cv::Mat bgr_mat = cv::imread("test.jpg");
cv::cvtColor(bgr_mat, yuv_mat, cv::COLOR_BGR2YUV_I420);
// 填充AVFrame
memcpy(frame->data[0], yuv_mat.data, 1920 * 1080);
memcpy(frame->data[1], yuv_mat.data + 1920 * 1080, 1920 * 540);
memcpy(frame->data[2], yuv_mat.data + 1920 * 1080 + 1920 * 540, 1920 * 540);
// 使用AVFrame进行解码等操作
// 释放资源
av_frame_free(&frame);
avcodec_close(codec_ctx);
avcodec_free_context(&codec_ctx);
return 0;
}
```
在代码中,首先初始化了FFmpeg库并创建了AVCodecContext对象。然后创建AVFrame对象,并设置其格式、宽度和高度,并使用av_frame_get_buffer函数为其分配内存。
接着,从Mat对象中读取YUV数据,并使用memcpy函数将数据填充到AVFrame对象的data数组中。需要注意的是,YUV数据在data数组中的存储顺序为Y、U、V,而且U和V的宽度和高度都是原图的一半。
最后,使用AVFrame对象进行解码等操作,并在程序结束时释放资源。
阅读全文