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用于保存视频流的有效信息。
2、初始化解码器
第一件事情就是初始化libavformat/libavcodec:ffmpeg注册复用器,编码器等的函数av_register_all()。
3、打开视频文件、取出文件头的流信息
这个函数读取文件的头部并且把信息保存到我们给的AVFormatContext结构体中。最后三个参数描述了文件格式,缓冲区大小(size)和格式参数;我们通过简单地指明NULL或0告诉 libavformat 去自动探测文件格式并且使用默认的缓冲区大小。
这一步会用有效的信息把 AVFormatContext 的流域(streams field)填满。
我们仅仅处理视频流,而不是音频流。为了让这件事情更容易理解,我们只简单使用我们发现的第一种视频流。
我们已经得到了一个指向视频流的称之为上下文的指针。接下来,我们需要找到真正的编码器打开它。
4、寻找视频流的解码器
在库里面查找支持该格式的解码器
5、打开解码器
6、给视频帧分配空间,以便存储解码后的图片数据
7、进行解码
通过该api读入一帧
通过下面的api进行解码一帧数据,将有效的图像数据存储到pAvFrame成员变量中
方法:使用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);
相关文章推荐
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- Managed Media Aggregation using Rtsp and Rtp
- [总结]FFMPEG视音频编解码零基础学习方法
- 买视频送图书-五月活动
- DVI 视频接口图文解析
- C#实现语音视频录制-附demo源码
- 编写C++程序使DirectShow进行视频捕捉
- AnyChat的视频会议程序实例详解
- 利用Ffmpeg获得flv视频缩略图和视频时间的代码
- C#调用mmpeg进行各种视频转换的类实例
- C#获取视频某一帧的缩略图的方法
- 基于jQuery的网页影音播放器jPlayer的基本使用教程
- codeigniter教程之上传视频并使用ffmpeg转flv示例
- 显示youtube视频缩略图和Vimeo视频缩略图代码分享
- PHP使用ffmpeg给视频增加字幕显示的方法
- PHP实现将视频转成MP4并获取视频预览图的方法
- PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
- C++实现优酷土豆去视频广告的方法
- PHP简单获取视频预览图的方法
- Android 音视频深入 十七 FFmpeg 获取RTMP流保存为flv (附源码下载)