ffmpge升级指南1 ffmpeg的简介

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() //裁剪音视频
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值