ffmpeg打开视频文件步骤

目的:解码h264文件,转存avi格式或者yuv格式,方便opencv处理。
方法:使用ffmpeg库来解码文件,转存

学习于:http://www.tuicool.com/articles/z6RFbu

1、理论探究
FFmpeg主要由一下几个部分组成:
libavcodec:一个包含了所有FFmpeg音视频编解码器的库。 为了保证最优性能和高可复用性,大多数编解码器从头开发的。
libavformat:一个包含了所有的普通音视格式的解析器和 产生器的库。
三个实例程序,这三个实例较为复杂,基本可以作为API使用手册:
ffmpeg:命令行的视频格式转换程序。
ffplay:视频播放程序。(需要SDL支持)
ffserver:多媒体服务器

使用ffmpeg SDK解码流过程:
1、准备变量
定义AVCodec,AVCodec *变量为解码器指针。
定义AVCodecContext,使用该变量可以将其定义为ffmpeg解码类的类成员。
定义AVFrame,AVFrame描述一个多媒体帧。解码后的数据将被放在其中。
定义AVFormatContext变量,AVFormatContext用于保存视频流的有效信息。

AVCodec *pCodec;
AVCodecContext *pContext;
AVFrame *pAvFrame;
AVFormatContext *pFormatCtx;

2、初始化解码器
第一件事情就是初始化libavformat/libavcodec:ffmpeg注册复用器,编码器等的函数av_register_all()。

av_register_all();

3、打开视频文件、取出文件头的流信息

// 打开视频文件
if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0)
       printf("Error!\n");

这个函数读取文件的头部并且把信息保存到我们给的AVFormatContext结构体中。最后三个参数描述了文件格式,缓冲区大小(size)和格式参数;我们通过简单地指明NULL或0告诉 libavformat 去自动探测文件格式并且使用默认的缓冲区大小。

// 取出流信息
if(av_find_stream_info(pFormatCtx)<0)
     handle_error(); // 不能够找到流信息

这一步会用有效的信息把 AVFormatContext 的流域(streams field)填满。

我们仅仅处理视频流,而不是音频流。为了让这件事情更容易理解,我们只简单使用我们发现的第一种视频流。

//遍历文件的各个流,找到第一个视频流,并记录该流的编码信息
videoindex = -1;
for(i=0; i<pFormatCtx->nb_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;
}
pCodecCtx=pFormatCtx->streams[videoindex]->codec;

我们已经得到了一个指向视频流的称之为上下文的指针。接下来,我们需要找到真正的编码器打开它。

4、寻找视频流的解码器
在库里面查找支持该格式的解码器

pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
if(pCodec == NULL)
    handle_error(); // 找不到解码器

5、打开解码器

if(avcodec_open(pCodecCtx, pCodec)<0)
    handle_error();

6、给视频帧分配空间,以便存储解码后的图片数据

pAvFrame = avcodec_alloc_frame();

7、进行解码
通过该api读入一帧

result = av_read_frame(pFormatCtx, packet);

通过下面的api进行解码一帧数据,将有效的图像数据存储到pAvFrame成员变量中

ret = avcodec_decode_video2(pCodecCtx, pAvFrame, &got_picture, packet);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值