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