ffmpeg 解码 到 opencv 之间传递

项目中需要用ffmpeg解码,并且将解码后的视频传入opencv。通过查找相关资料进行快速学习实现了这个需求。现进行简单的记录和分享。

ffmpeg 解码函数:len = avcodec_decode_video2(pInputCodecContext, dst, &nComplete, &InPack);     dst 为 AVFrame *dst,存放了解码后的数据。解码后存入dst的视频是yuv420格式。dst->data[0],dst->data[1],dst->data[2] 中分别存了 yuv的数据。dst->width*dst->height 是原始视频的分辨率。

opencv 结构体 Mat frame, frame=frame.create(dst->height*1.5, dst->width, CV_8UC1);  用frame存储 yuv420 的数据, yuv 需要申请的内存大小为dst->width*dst->height *1.5

memcpy(frame.data,dst->data[0], dst->width*dst->height);  存入 y
memcpy(frame.data+640*480,dst->data[1], dst->width*dst->height/4);   存入 u
memcpy(frame.data+640*480*5/4,dst->data[2], dst->width*dst->height/4);  存入 v

这样解码后的yuv420 数据就存入了opencv中。可添加

cv::cvtColor(frame, rgbImg,CV_YUV2BGR_I420);  //yuv转成rgb
if(frame.empty())break;
imshow("frame",rgbImg);

waitKey(1); 显示解码后的视频

你可能感兴趣的:(音视频)