ffmpeg的简介
gcc -g -O2 -o test test.c -I
-g:输出文件中的调试信息
-O:对输出文件做指令优化
-o:输出文件
-I:指定头文件
-L:指定库文件位置
-l:指定使用哪个库
编译过程:
预编译->编译->链接,动态链接/静态链接->
GDB调试器
设置断点:b
运行程序:r
单步执行:n
跳入函数:s
跳出函数:finish
打印内容:p
执行剩余程序:c
avfilter:是ffmpeg最复杂的模块。可以实现音视频处理:男声变女声,女声。还可以自己实现filter.
avformat:初级入门主要学习的部分。
ffmpeg初级
打印日志
#include <libavutil/log.h> // 头文件
av_log_set_level(AV_LOG_DEBUG) // 设置日志级别
av_log(NULL,AV_LOG_INFO,"..%s\n",op) // 打印日志
//日志级别
//AV_LOG_ERROR
//AV_LOG_WARNING
//AV_LOG_INFO
//AV_LOG_DEBUG
删除文件与重命名
#include <libavformat/avformat.h> // 对文件的操作在这个函数
avpriv_io_delete() //删除文件
avpriv_io_move(src,dst) //重命名文件 参数:源,目的
操作目录
#include <libavutil/log.h> //打印输出信息
#include <libavformat/avformat.h> // 目录管理函数再这里
int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options); // 打开目录 url——是传入的目录路径;s 是返回的目录上下文,类似文件描述符,
int avio_read_dir(AVIODirContext *s, AVIODirEntry **next);// 每调取一次,将会获得下一子项,AVIODirEntry 用来描述目录子项信息
typedef struct AVIODirEntry {
char *name; // 文件名
int type; // 文件类型
int utf8; // 值为1,表示文件名是以UTF-8编码;值为0,表示其它编码
int64_t size;//文件大小
int64_t modification_timestamp;//修改时间戳,从Epoch(1970年1月1日00:00:00 UTC )到现在的微秒数,下同;
int64_t access_timestamp; //访问时间戳
int64_t status_change_timestamp;//更改文件属性时间戳
int64_t user_id; //用户ID
int64_t group_id;//组ID
int64_t filemode;//文件模式
} AVIODirEntry;
enum AVIODirEntryType {
AVIO_ENTRY_UNKNOWN, // 位置
AVIO_ENTRY_BLOCK_DEVICE,//块设备,如硬盘等
AVIO_ENTRY_CHARACTER_DEVICE,// 字符设备
AVIO_ENTRY_DIRECTORY,//目录
AVIO_ENTRY_NAMED_PIPE,//管道
AVIO_ENTRY_SYMBOLIC_LINK,//链接文件
AVIO_ENTRY_SOCKET,//socket描述符
AVIO_ENTRY_FILE,//普通文件
AVIO_ENTRY_SERVER,//???
AVIO_ENTRY_SHARE,//共享内存???
AVIO_ENTRY_WORKGROUP,//???
};
int avio_close_dir(AVIODirContext **s); // 关闭目录
avid_free_directory_entry(&entry); // 释放空间
// 结构体
AVIODirContext // 操作目录的上下文
AVIODirEntry //目录项 用于存放文件名,文件大小等信息
av_err2str(int )// 将整形转换为字符串
goto _fail;
-fail
多媒体文件
多媒体文件其实是个容器:在容器里面有很多流(Stream/Track)。
每种流是由不同的编码器编码的。
从流里读出的数据成为包
在一个包中包含着一个或多个帧。
操作流数据的基本步骤
解复用->获取流->读取数据包->释放资源
// 打印音/视频信息
AVFormatContext//链接上下文的结构体
AVStream;//流或者轨的概念
AVPacker;//包
av_register_all() // 将协议和库注册。程序开始前调用
avformat_open_input()/avformat_close_input();//
av_dump_format() // 打印多媒体文件的信息
av_init_packer() // 初始化一个数据包的结构体
av_find_best_stream() //找到流
av_read_frame()/av_apcker_unref() // 读取数据包/防止内存泄漏
抽取视频数据
Start code : 特征码
SPS/PPS:1 解码的视频参数,宽高分辨率,帧率。普通的多媒体文件,只有一个SPS/PPS。2 切换分辨率和更改参数,就更新SPS/PPS。 3 直播流里面,经常丢数据,在关键帧前面,增加SPS/PPS数据。而且SPS/PPS很小。
codec->extradate:在这里面获取SPS/PPS。
ffplay *** 播放视频
将MP4转成FLV格式
avformat_alloc_output_context2() // 分配一个输出文件的上下文空间
avformat_free_context() // 释放
avformat_new_stream() //一个多媒体文件包含很多流,新的多媒体同样有这些流。
avcodec_parameters_copy() // new stream 之后 拷贝参数
// 所有多媒体的格式,使用了这一套API
avformat_write_header() //生成多媒体头
av_write_frame()/av_interleaved_write_frame()// 写数据 后一个更常用
av_write_trailer() // 写出尾部数据
截取一段视频合并音视频
av_seek_frame() //裁剪音视频