1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| ///////////////////////////////////////////////////只解码不显示抓图实现方式/////////////////////////////// void CALLBACK DecodeFrameCallback(long nPort, char* pBuffer, long nSize, FRAME_INFO* pFrameInfo, long nReserved1, long nReserved2) { spdlog::info("播放解码数据回调函数 nSize={},nWidth={},nHeight={},nStamp={},nType={}", nSize, pFrameInfo->nWidth, pFrameInfo->nHeight, pFrameInfo->nStamp, pFrameInfo->nType);
switch (pFrameInfo->nType) { case T_RGB32: //视频数据,yv12格式 break; case T_UYVY: //视频数据,uyvy格式 break; case T_YV12: //视频数据。每个像素4个字节,排列方式与位图相似,“B-G-R-0 …”,第一个像素位于图像左下角 //保存jpeg图像到磁盘 { //获取yv12缓存转换成mat对象逻辑 long time1 = clock(); IplImage* pImgYCrCb = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 3);//得到图像的Y分量 yv12toYUV(pImgYCrCb->imageData, pBuffer, pFrameInfo->nWidth, pFrameInfo->nHeight, pImgYCrCb->widthStep);//得到全部RGB图像 spdlog::info("图片数据width={}, height={}, 行数={}", pFrameInfo->nWidth, pFrameInfo->nHeight, pImgYCrCb->widthStep); IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 3); //rbg 图像 cvCvtColor(pImgYCrCb, pImg, CV_YCrCb2RGB); //拿到img对象 组装mat cv::Mat mat = cv::cvarrToMat(pImg, true); cvReleaseImage(&pImgYCrCb); cvReleaseImage(&pImg); long time2 = clock(); spdlog::info("yv12转mat起始时间={},结束时间={},耗时{}", time1, time2, time2 - time1);
//使用imwrite保存jpeg文件 char fileName[256] = { 0 }; sprintf_s(fileName, "../pic/%d_%d_%d.jpg", pFrameInfo->nWidth, pFrameInfo->nHeight, pFrameInfo->nStamp); std::vector<int> compression_params; compression_params.push_back(cv::IMWRITE_JPEG_QUALITY); compression_params.push_back(98); //jpeg压缩质量 0-100 100无压缩 imwrite(fileName, mat, compression_params); spdlog::info("图片帧获取成功, 图像帧率={},图像帧数={}", pFrameInfo->nFrameRate, pFrameInfo->dwFrameNum); }
//需要把YV12转换错JPEG、bmp break;
case T_AUDIO16: //音频数据 break; default: break; } }
|