您的位置:首页 > 其它

ffmpeg打开视频文件步骤

2016-05-28 14:32 232 查看
目的:解码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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ffmpeg 视频