引言
FFmpeg 学习之路,个人通过多方资料阅读而得出的,做个记录,也分享给其他人,降低不必要的社会劳动力。
简介
操作系统:window 7 x64
使用IDE :Qt Creator 4.2.1
使用语言:纯C语言
FFmpeg版本:3.3.1
请务必下载源码,进行跟读
版权所有:_OE_, 转载请注明出处:http://blog.csdn.net/csnd_ayo
下载
还没整理好,有需要的可以留邮箱。
介绍
对于 ffmpeg
在这里我就不做介绍了,可以自行百度。在这里主要对源码进行逐一解释。
FFmpeg 架构图
这是根据源码的执行流程画的执行架构图,点击可查看大图
该架构图对应的讲解视频 [点击前往]
我们的代码将根据这张架构图的路线进行编写。
而我们这篇文章就是对每个调用过程做一个较为详细的讲解。
变量的声明
// typedef struct AVFormatContext {
// struct AVInputFormat *iformat;
// struct AVOutputFormat *oformat;
// AVIOContext *pb;
// unsigned int nb_streams;
// AVStream **streams;
// char filename[1024]; /**< input or output filename */
// ....
// } AVFormatContext;
// AVFormatContext在FFMpeg里是一个非常重要的的结构,是其它输入、输出相关信息的一个容器
// 以上只列出了其中的部分成员
// 作为输入容器时 struct AVInputFormat *iformat; 不能为空, 其中包含了输入文件的音视频流信息,程序从输入容器从读出音视频包进行解码处理
// 作为输出容器时 struct AVOutputFormat *oformat; 不能为空, 程序把编码好的音视频包写入到输出容器中
// AVIOContext *pb: I/O上下文,通过对该变量赋值可以改变输入源或输出目的
// unsigned int nb_streams; 音视频流数量
// AVStream **streams; 音视频流
// 视频流的格式内容
AVFormatContext *pFormatCtx;
/// 解码器上下文
AVCodecContext *pCodecCtx;
/// 解码器
AVCodec *pCodec;
/// 结构性视频数据
AVFrame *pFrame, *pFrameRGB;
/// 视频数据包 (1帧)
AVPacket *packet;
uint8_t *out_buffer;
struct SwsContext *sws_ctx;
int videoStream, numBytes;
int ret, frameFinished;
注册初始化
/// 内部调用 avcodec_register_all()
/// avcodec_register_all()注册了和编解码器有关的组件:硬件加速器,
/// 解码器,编码器,Parser,Bitstream Filter。
/// av_register_all()除了调用avcodec_register_all()之外,