ffmpeg解码+opencv显示

转载 2015年07月09日 12:51:22



ffmpeg 解码h264,并OPENCV显示

 (2013-12-18 10:31:01)
   
#include "stdafx.h"


#pragma comment(lib, "avcodec.lib   ")
#pragma comment(lib, "avformat.lib  ")
#pragma comment(lib, "avutil.lib    ")
#pragma comment(lib, "avdevice.lib  ")
#pragma comment(lib, "avfilter.lib  ")
#pragma comment(lib, "postproc.lib  ")
#pragma comment(lib, "swresample.lib")
#pragma comment(lib, "swscale.lib   ")
#pragma comment(lib, "libmysql.lib  ")
#pragma comment(lib, "opencv_highgui243d.lib")
#pragma comment(lib, "opencv_core243d.lib   ")


int _tmain(int argc, _TCHAR* argv[])
{
AVFrame *pFrame = NULL,*pFrameRGB = NULL;
AVFormatContext *pFormatCtx  = NULL;
int i=0, videoindex=0;
AVCodecContext *pCodecCtx   = NULL;
AVCodec *pCodec      = NULL;
char filepath[]="opencv.h264";
IplImage* pCVFrame = NULL; 
int nFrame = 0;
uint8_t *out_bufferRGB;
int ret, got_picture;
static struct SwsContext *img_convert_ctx = NULL;
int y_size = 0;
AVPacket *packet = NULL;

//ffmpeg注册复用器,编码器等的函数av_register_all()。
//该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才能使用复用器,编码器等。
av_register_all();

//需要播放网络视频
avformat_network_init();

pFormatCtx = avformat_alloc_context();

//打开视频文件
if(avformat_open_input(&pFormatCtx,filepath,NULL,NULL)!=0)
{
printf("无法打开文件\n");
return -1;
}

//查找文件的流信息
if(av_find_stream_info(pFormatCtx)<0)
{
printf("Couldn't find stream information.\n");
return -1;
}

cvNamedWindow("decode");  

//遍历文件的各个流,找到第一个视频流,并记录该流的编码信息
videoindex=-1;
for(i=0; inb_streams; i++) 
{
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO)
{
videoindex=i;
break;
}
}
if(videoindex==-1)
{
printf("Didn't find a video stream.\n");
return -1;
}
pCodecCtx=pFormatCtx->streams[videoindex]->codec;

//在库里面查找支持该格式的解码器
pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
if(pCodec==NULL)
{
printf("Codec not found.\n");
return -1;
}

//打开解码器
if(avcodec_open(pCodecCtx, pCodec)<0)
{
printf("Could not open codec.\n");
return -1;
}

//分配一个帧指针,指向解码后的原始帧
pFrame=avcodec_alloc_frame();

//分配一个帧指针,指向存放转换成RGB后的帧
pFrameRGB = avcodec_alloc_frame();

//给pFrameRGB帧加上分配的内存;
out_bufferRGB=new uint8_t[avpicture_get_size(PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height)];
avpicture_fill((AVPicture *)pFrameRGB, out_bufferRGB, PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);

y_size = pCodecCtx->width * pCodecCtx->height;

//分配帧内存
packet=(AVPacket *)malloc(sizeof(AVPacket));
av_new_packet(packet, y_size);

//输出一下信息-----------------------------
printf("文件信息-----------------------------------------\n");
av_dump_format(pFormatCtx,0,filepath,0);//av_dump_format只是个调试函数,输出文件的音、视频流的基本信息了,帧率、分辨率、音频采样等等
printf("-------------------------------------------------\n");

//av_read_frame 读取一个帧(到最后帧则break)
while(av_read_frame(pFormatCtx, packet)>=0)
{
if(packet->stream_index==videoindex)
{
//解码一个帧
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);
if(ret < 0)
{
printf("解码错误\n");
return -1;
}
if(got_picture)
{
printf("帧号: %d \n",nFrame);
nFrame++;

//根据编码信息设置渲染格式
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL); 

//----------------------opencv
if (NULL == pCVFrame)
{
pCVFrame=cvCreateImage(cvSize(pCodecCtx->width, pCodecCtx->height),8,3); 
}
 
if(img_convert_ctx != NULL)  
{  
sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
memcpy(pCVFrame->imageData,out_bufferRGB,pCodecCtx->width*pCodecCtx->height*24/8);
pCVFrame->widthStep=pCodecCtx->width*3; //4096
pCVFrame->origin=0;
 
cvShowImage("decode",pCVFrame);//显示  
//cvReleaseImage( &pCVFrame ); //释放图像

//如果不设置由于这是个循环,会导致看不到显示出来的图像
if( cvWaitKey(20) >= 0 )
break;
}  

}
}
}

 
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);
    if(got_picture) 
{  
        printf("最后一帧 %d\n", nFrame);  
        nFrame++;  

//根据编码信息设置渲染格式
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); 

//----------------------opencv
if (NULL == pCVFrame)
{
pCVFrame=cvCreateImage(cvSize(pCodecCtx->width, pCodecCtx->height),8,3); 
}

if(img_convert_ctx != NULL)  
{  
sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
memcpy(pCVFrame->imageData,out_bufferRGB,pCodecCtx->width*pCodecCtx->height*24/8);
pCVFrame->widthStep=pCodecCtx->width*3; //4096
pCVFrame->origin=0;

cvShowImage("decode",pCVFrame);//显示  
cvWaitKey(20);
}  
    }  

//释放本次读取的帧内存
av_free_packet(packet);

cvReleaseImage( &pCVFrame ); //释放图像
delete[] out_bufferRGB;
av_free(pFrameRGB);
avcodec_close(pCodecCtx);
avformat_close_input(&pFormatCtx);

return 0;
}




android jni中将大数据回调到java层的时候用法,比如视频流,音频流等,图片流等 比如我用ffmpeg解码好视频流,想送到java层使用opengGL进行显示,opencv进行人脸识别等等

android jni中将大数据回调到java层的时候用法,比如视频流,音频流等,图片流等 比如我用ffmpeg解码好视频流,想送到java层使用opengGL进行显示,opencv进行人脸识别等等j...

ffmpeg解码+opencv显示+时间测试

/** * 抽取ffmpeg中的函数接口实现视频解码,再通过Opencv中的函数接口播放 */ #define _CRTDBG_MAP_ALLOC #include #define __STDC...
  • tkp2014
  • tkp2014
  • 2015年07月09日 13:34
  • 623

FFmpeg解码封装为类以及Opencv显示播放

// 解码函数接口头文件 //#ifndef __FFMPEG_DECODE_H__ //#define __FFMPEG_DECODE_H__ // Opencv #include #in...
  • tkp2014
  • tkp2014
  • 2015年08月02日 10:58
  • 423

FFmpeg 学习之 解码并 MFC+OpenCV 显示

众所周知,Opencv 在图像处理方面具有无与伦比的优势,但其在视频解码这块实在不敢恭维,智能识别 AVI 封装和少数几种 编码格式。 其实 OpenCV 解码也是引用的 FFmpeg,不过编译时估...

利用ffmpeg和opencv进行视频的解码播放

OpenCV中有自己的用于处理图片和视频的类,可以很方便的读入文件和显示。 现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处理,所以需要将ffmpeg中得到的数据...

利用ffmpeg和opencv进行视频的解码播放

引子 OpenCV中有自己的用于处理图片和视频的类VideoCapture,可以很方便的读入文件和显示。 现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处理,...

利用ffmpeg和opencv进行视频的解码播放

 引子 OpenCV中有自己的用于处理图片和视频的类VideoCapture,可以很方便的读入文件和显示。现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处...
  • zxh2075
  • zxh2075
  • 2016年07月19日 17:22
  • 2608

ffmpeg和Opencv结合进行视频解码播放

引子 OpenCV中有自己的用于处理图片和视频的类VideoCapture,可以很方便的读入文件和显示。 现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处...
  • tkp2014
  • tkp2014
  • 2015年06月25日 21:43
  • 1197

Qt+FFMPEG解码视频并显示

  • 2016年09月07日 20:18
  • 13.05MB
  • 下载

H2.64_ffmpeg_解码显示rgb图像

  • 2016年04月29日 08:09
  • 39.5MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ffmpeg解码+opencv显示
举报原因:
原因补充:

(最多只允许输入30个字)