FFMPEG在VC中的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FFMPEG在VC中的应用
一、解码显示过程
1、注册所用编码器或者解码器
av_register_all();
2、打开视频文件
AVFormatContext *pFormatCtx;//AVFormatContext 即format I/O context,比较重要,里面记录了流文件相关信息,基本贯穿整个处理流程
// Open video file
if(av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL)!=0)
return -1; // Couldn't open file
dump_format(pFormatCtx, 0,argv[1], 0);//用于调试,可以输出一些相关信息的
3、获取流的一些信息,比如说解码时需要的height及width
if(av_find_stream_info(pFormatCtx)<0)
return -1; // Couldn't find stream information
4、找到视频流
AVCodecContext *pCodecCtx;//AVCodecContext即Codec的相关信息
// Find the first video stream
int videoStream=-1;
for(int i=0; i
{
if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO) {
videoStream=i;
break;
}
}
if(videoStream==-1)
return -1; // Didn't find a video stream
// Get a pointer to the codec context for the video stream
pCodecCtx=pFormatCtx->streams[videoStream]->codec;
5、为对应的视频流找到编解码器
// Find the decoder for the video stream
AVCodec *pCodec;//编解码器信息
pCodec = NULL;
pCodec=avcodec_find_decoder(pCodecCtx->codec_id); if(pCodec==NULL) {
fprintf(stderr, "Unsupported codec!\n");
return -1; // Codec not found
}
6、为对应的流打开所需要的编码器
// Open codec
if(avcodec_open(pCodecCtx, pCodec)<0)
return -1; // Could not open code
7、解码
-----分配一个AVFrame的结构,用于记录原始图像信息AVFrame *pFrame;
pFrame = NULL;
pFrame = avcodec_alloc_frame();
if(pFrame==NULL)
return -1;
-----根据图像大小创建一个缓冲区
uint8_t *buffer;
int numBytes;
// Determine required buffer size and allocate buffer
numBytes=avpicture_get_size(PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
avpicture_fill((AVPicture *)pFrame, buffer, PIX_FMT_RGB24,
pCodecCtx->width, pCodecCtx->height);//填充AVPicture对应域
-------解码
int frameFinished;
AVPacket packet;
i=0;
while(av_read_frame(pFormatCtx, &packet)>=0) {
// Is this a packet from the video stream?
if(packet.stream_index==videoStream) {
// Decode video frame
avcodec_decode_video(pCodecCtx, pFrame, &frameFinished,
packet.data, packet.size);
// Did we get a video frame?
if(frameFinished) {
显示视频。。。。。。
}
}
// Free the packet that was allocated by av_read_frame
}
-------释放资源
av_free_packet(&packet);
av_free(buffer);
av_free(pFrame);
// Close the codec
avcodec_close(pCodecCtx);
// Close the video file
av_close_input_file(pFormatCtx);
-------显示视频
1)加入SDL动态库
1)下载SDL开发包SDL-devel-1.2.14-VC6.zip,并解压主要生成include、lib文件