Created
April 17, 2014 01:30
-
-
Save lxj5891/10946980 to your computer and use it in GitHub Desktop.
ffmpeg 编程
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
av_register_all(); | |
if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0) | |
printf("error!\n"); | |
if(av_find_stream_info(pFormatCtx)<0) | |
printf("error!\n"); | |
videoStream=-1; | |
for(i=0; i<pFormatCtx->nb_streams; i++) | |
if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO) | |
{ | |
videoStream=i; | |
break; | |
} | |
if(videoStream==-1) | |
printf("error!\n");// Didn't find a video stream | |
// 得到视频流编码上下文的指针 | |
pCodecCtx=pFormatCtx->streams[videoStream]->codec; | |
然后选择解码器进行解码: | |
AVCodec *pCodec; | |
// 寻找视频流的解码器 | |
pCodec=avcodec_find_decoder(pCodecCtx->codec_id); | |
if(pCodec==NULL) | |
printf("error!\n");// 找不到解码器 | |
// 打开解码器 | |
if(avcodec_open(pCodecCtx, pCodec)<0) | |
printf("error!\n"); // 打不开解码器 | |
现在开始,进入解码和提取关键帧的过程: | |
pFrame=avcodec_alloc_frame(); | |
pFrameRGB = avcodec_alloc_frame(); | |
numBytes=avpicture_get_size(PIX_FMT_BGR24, pCodecCtx->width,pCodecCtx->height); | |
buffer=new uint8_t[numBytes]; | |
avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,pCodecCtx->width, pCodecCtx->height); | |
pSWSCtx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); | |
i=0; | |
while(av_read_frame(pFormatCtx,&packet)>=0) | |
{ | |
if(packet.stream_index==videoStream) | |
{ | |
avcodec_decode_video(pCodecCtx, pFrame, &frameFinished,packet.data, packet.size); | |
if(frameFinished) | |
{ | |
if(pFrame->key_frame==1) // 这就是关键帧 | |
{ | |
sws_scale(pSWSCtx, pFrame->data, pFrame->linesize,0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize); | |
// 保存到磁盘 | |
char pic[200]; | |
sprintf(pic,"pic%d.bmp",i); | |
i++; | |
av_create_bmp(pic,pFrameRGB->data[0],pCodecCtx->width,pCodecCtx->height,24); | |
} | |
} | |
} | |
av_free_packet(&packet); | |
} | |
最后,释放资源和句柄 | |
// 释放 RGB 图象 | |
av_free(pFrameRGB); | |
// 释放YUV 帧 | |
av_free(pFrame); | |
sws_freeContext(pSWSCtx); | |
// 关闭解码器(codec) | |
avcodec_close(pCodecCtx); | |
// 关闭视频文件 | |
av_close_input_file(pFormatCtx); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment