赞
踩
视频文件有几个基本组件。 首先,文件本身称为容器,容器的类型决定了文件中信息的位置。 比如AVI和Quicktime。 是一系列的streams, 通常有一个音频流和一个视频流。流中的数据元素称为帧。 每个流由不同种类的编解码器编码。 编解码器定义了数据是如何编码和解码的 - 因此称为CODEC。比如DivX和MP3. 数据包是可以包含数据的数据片段,这些数据可以被解码为原始帧,每个数据包包含完整的帧,在音频流下可能包含多个帧。
处理音视频数据不比较简单,主要分为以下几个步骤:
10 打开视频文件,获取streams
20 从video_stram中获取数据包,转换为帧
30 帧未读取完继续执行20
40 处理帧
50 跳转20
使用FFmpeg处理视频非常简单,本文介绍如何将一个视频文件的帧数据保存为一张ppm格式图片(ppm是一种非常简单的原始RGB数据文件,它包含一个非常简单的头信息,其余的数据全部是RGB数据).
首先我们要将用到的库引入进来,编写一个错误输出函数:
- #include <libavcodec/avcodec.h>
- #include <libavutil/imgutils.h>
- #include <libswscale/swscale.h>
- #include <libavformat/avformat.h>
- #include <libavutil/error.h>
-
- void showErrMsg(int errNum, char *msg, size_t msgSize) {
- memset(msg, 0, msgSize);
- av_strerror(errNum, msg, msgSize);
- fprintf(stderr, msg);
- }
该函数将FFmpeg内部的错误代码转换为了字符串,提高可读性.下面编写主函数,要求传入至少一个参数,并将该参数作为文件路径来打开.
- fileName = argv[1];
-
- if (argc < 2) {
- fprintf(stderr, "Please use FFmpegDemo1 <file> to open a video file");
- return -1;
- }
-
- if ((errNum = avformat_open_input(&pFormatCtx, fileName, NULL, NULL)) != 0) {
- showErrMsg(errNum, errMsg, 400);
- return -1;
- }
在4版本中av_aregister_all()函数已经被废弃,不需要再编写任何信息
int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options)
函数的作用是打开url指向的文件
AVFormatContext
是FFmepg非
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。