opencv的highgui显示ffmpeg的数据

11 篇文章 0 订阅
9 篇文章 0 订阅


ffmpeg是一个强大的开源的编解码用的库,功能及其强大,但是由于其官方的文档少的可怜,例子少的可怜十分不利于普通初学者学习。我有opencv的基础,opencv的highgui做的界面虽然简单,但是代码也简单。在我不断的探索下,终于可以使用opencv的界面来显示ffmpeg的处理结果了。

下面的ffmpeg代码是参考:http://blog.csdn.net/jia_zhengshen/article/details/10334313来写的,opencv部分有注释。

但是注意程序没有进行内存的清理,所以嘛,如果影片的很大的话,哈哈,你的内存完蛋了。

http://abowman-dog-gadget.googlecode.com/svn/trunk/dog.swf

#include<opencv\cv.h>
#include<opencv\highgui.h>
#ifdef  __cplusplus  
extern "C" {  
#endif  
#include<avcodec.h>
#include<avformat.h>
#include<libswscale\swscale.h>
int main()
{
	IplImage *img ;//= cvCreateImage(
	av_register_all();
	avcodec_register_all();
	avformat_network_init();
	AVFormatContext *pFormatCtx = NULL;
	char *filename = "test.flv";
	if( avformat_open_input(&pFormatCtx,filename,NULL,NULL) !=	0)
		return 1;
	if( av_find_stream_info(pFormatCtx) <0)
		return 2;
	av_dump_format(pFormatCtx,0,filename,0);
	
	AVCodecContext *pCodecCtx;
	int i=-1;
	int videoStream =-1;
	for(i=0;i<pFormatCtx->nb_streams;i++)
	{
		if(pFormatCtx->streams[i]->codec->codec_type== AVMEDIA_TYPE_VIDEO)
		{
			videoStream = i;
			break;
		}
	}//for
	if(videoStream ==-1)
	{
		return 3;
	}
	pCodecCtx= pFormatCtx->streams[videoStream]->codec;
	AVCodec *pCodec ;
	pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
	if(pCodec ==NULL)
		return 4;
	if(avcodec_open(pCodecCtx,pCodec)<0)
		return 5;
	AVFrame *pFrame ;
	pFrame = avcodec_alloc_frame();
	AVFrame  *pFrameRGB;
	pFrameRGB= avcodec_alloc_frame();
	uint8_t *buffer ;
	int numBytes;
	numBytes = avpicture_get_size(PIX_FMT_RGB24,pCodecCtx->width,
		pCodecCtx->height);
	buffer  = (uint8_t *)av_malloc(numBytes*sizeof(char) );
	avpicture_fill((AVPicture *)pFrameRGB,buffer,PIX_FMT_RGB24,
		pCodecCtx->width,pCodecCtx->height);

	int frameFinished;
	AVPacket packet;
	i=0;
	while(av_read_frame(pFormatCtx,&packet)>=0 )
	{
		if(packet.stream_index == videoStream )
		{
			avcodec_decode_video2(pCodecCtx,pFrame,&frameFinished,&packet);
			if(frameFinished)
			{
				SwsContext *pSwsCtx;
				pSwsCtx = sws_getContext(pCodecCtx->width,
					pCodecCtx->height,pCodecCtx->pix_fmt,
					pCodecCtx->width,pCodecCtx->height,
					AV_PIX_FMT_BGR24,SWS_POINT,NULL,NULL,NULL
					);
				sws_scale(pSwsCtx,pFrame->data,pFrame->linesize,0,
					pCodecCtx->height,pFrameRGB->data,pFrameRGB->linesize
					);//ffmpeg的从yuv420格式转换到bgr24格式。
				int w = pCodecCtx->width;
				int h = pCodecCtx->height;
				img = cvCreateImageHeader(cvSize(w,h),8,3);
				img->imageData =(char *)(*( pFrameRGB->data) );//把ffmpeg格式转换到opencv的bgr格式。
				cvShowImage("img",img);
				IplImage *imgbgr = cvCreateImage(cvSize(w,h),8,3);
				//cvCvtColor(img,imgbgr,CV_RGB2BGR);
				cvCvtColor(img,imgbgr,CV_BGR2HSV);
				cvShowImage("HSV",imgbgr);
				cvWaitKey(2);
			}//得到了一帧frame
		}//video
	}//while
	printf("tttttt");
}
#ifdef  __cplusplus  
}  
#endif  







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值