mjpeg解码到rgb
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mjpeg解码到rgb相关的知识,希望对你有一定的参考价值。
mjpeg解码
mjpeg 解码可以使用opencv ,或者libjpeg,当系统中本来就使用ffmpeg的时候,可以使用ffmpeg直接解码
void MJPEGToRGB(unsigned char *data, unsigned int dataSize, unsigned char *outBuffer)
{
//元数据装填到packet
AVPacket *avPkt = av_packet_alloc();
avPkt->size = dataSize;
avPkt->data = data;
//创建并配置codecContext
AVCodec *mjpegCodec = avcodec_find_decoder(AV_CODEC_ID_MJPEG);
AVCodecContext* codecCtx = avcodec_alloc_context3(mjpegCodec);
avcodec_get_context_defaults3(codecCtx, mjpegCodec);
avcodec_open2(codecCtx, mjpegCodec, nullptr);
//解码
auto ret = avcodec_send_packet(codecCtx, avPkt);
if (ret >=0) {
AVFrame* YUVFrame = av_frame_alloc();
ret = avcodec_receive_frame(codecCtx, YUVFrame);
if (ret >= 0) {
// 4.YUV转RGB24
AVFrame* RGB24Frame = av_frame_alloc();
struct SwsContext* convertCxt = sws_getContext(
YUVFrame->width, YUVFrame->height, AV_PIX_FMT_YUV420P,
YUVFrame->width, YUVFrame->height, AV_PIX_FMT_RGB24,
SWS_POINT, NULL, NULL, NULL
);
// outBuffer将会分配给RGB24Frame->data,AV_PIX_FMT_RGB24格式只分配到RGB24Frame->data[0]
av_image_fill_arrays(
RGB24Frame->data, RGB24Frame->linesize, outBuffer,
AV_PIX_FMT_RGB24, YUVFrame->width, YUVFrame->height,
1
);
sws_scale(convertCxt, YUVFrame->data, YUVFrame->linesize, 0, YUVFrame->height, RGB24Frame->data, RGB24Frame->linesize);
// 5.清除各对象/context -> 释放内存
// free context and avFrame
sws_freeContext(convertCxt);
av_frame_free(&RGB24Frame);
// RGB24Frame.
}
// free context and avFrame
av_frame_free(&YUVFrame);
}
// free context and avFrame
av_packet_unref(avPkt);
av_packet_free(&avPkt);
avcodec_free_context(&codecCtx);
}
显示
显示可以有两种方法:
1 opencv直接显示
2 sdl显示
两个的区别是看我们使用了什么,如果我们里面本来就有opencv,那直接显示就好,如果使用了sdl2,直接使用sdl2,sdl2的好处是直接显示yuv420p,不用转换成BGR,如何使用请看
以上是关于mjpeg解码到rgb的主要内容,如果未能解决你的问题,请参考以下文章