AVFrame与Mat
extern "C" { #include "libavutil/avutil.h" #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include <libavutil/imgutils.h> } #include <opencv2/core.hpp> //AVFrame 转 cv::mat cv::Mat avframeToCvmat(const AVFrame * frame) { int width = frame->width; int height = frame->height; cv::Mat image(height, width, CV_8UC3); int cvLinesizes[1]; cvLinesizes[0] = image.step1(); SwsContext* conversion = sws_getContext(width, height, (AVPixelFormat) frame->format, width, height, AVPixelFormat::AV_PIX_FMT_BGR24, SWS_FAST_BILINEAR, NULL, NULL, NULL); sws_scale(conversion, frame->data, frame->linesize, 0, height, &image.data, cvLinesizes); sws_freeContext(conversion); return image; } //cv::Mat 转 AVFrame AVFrame* cvmatToAvframe(cv::Mat* image, AVFrame * frame){ int width = image->cols; int height = image->rows; int cvLinesizes[1]; cvLinesizes[0] = image->step1(); if (frame == NULL){ frame = av_frame_alloc(); av_image_alloc(frame->data, frame->linesize, width, height, AVPixelFormat::AV_PIX_FMT_YUV420P, 1); } SwsContext* conversion = sws_getContext(width, height, AVPixelFormat::AV_PIX_FMT_BGR24, width, height, (AVPixelFormat) frame->format, SWS_FAST_BILINEAR, NULL, NULL, NULL); sws_scale(conversion, &image->data, cvLinesizes , 0, height, frame->data, frame->linesize); sws_freeContext(conversion); return frame; }
AVFrame* ProcessFrame(AVFrame *frame, int stream_index) { //first part AVStream *in_stream = ifmt_ctx->streams[stream_index]; AVCodecContext *pCodecCtx = in_stream->codec; AVFrame *pFrameRGB = NULL; struct SwsContext * img_convert_ctx = NULL; if(img_convert_ctx == NULL){ img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL); } pFrameRGB = av_frame_alloc(); int size = avpicture_get_size(AV_PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height); uint8_t *out_bufferRGB = (uint8_t *)av_malloc(size); avpicture_fill((AVPicture *)pFrameRGB, out_bufferRGB, AV_PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height); sws_scale(img_convert_ctx, frame->data, frame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize); Mat imageFrame = Mat(pCodecCtx->height, pCodecCtx->width, CV_8UC3, out_bufferRGB); /////////////////////////////////////////////////////////// //second part starts avpicture_fill((AVPicture *)pFrameRGB, imageFrame.data,AV_PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height); struct SwsContext * convert_ctx = NULL; if(convert_ctx == NULL){ convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, SWS_BICUBIC, NULL, NULL, NULL); } AVFrame *srcFrame = av_frame_alloc(); size = avpicture_get_size(pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height); uint8_t *out_buffer = (uint8_t *)av_malloc(size); //占内存 avpicture_fill((AVPicture *)srcFrame, out_buffer, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height); sws_scale(convert_ctx, pFrameRGB->data, pFrameRGB->linesize, 0, pCodecCtx->height, srcFrame->data, srcFrame->linesize); av_free(pFrameRGB); srcFrame->width = frame->width; srcFrame->height = frame->height; srcFrame->format = frame->format; av_frame_copy_props(srcFrame, frame); return srcFrame; }
extern "C" {
#include "libavutil/avutil.h"
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include <libavutil/imgutils.h>
}
#include <opencv2/core.hpp>
//AVFrame 转 cv::mat
cv::Mat avframeToCvmat(const AVFrame * frame)
{
int width = frame->width;
int height = frame->height;
cv::Mat image(height, width, CV_8UC3);
int cvLinesizes[1];
cvLinesizes[0] = image.step1();
SwsContext* conversion = sws_getContext(width, height, (AVPixelFormat) frame->format, width, height, AVPixelFormat::AV_PIX_FMT_BGR24, SWS_FAST_BILINEAR, NULL, NULL, NULL);
sws_scale(conversion, frame->data, frame->linesize, 0, height, &image.data, cvLinesizes);
sws_freeContext(conversion);
return image;
}