FFmpeg库
FFmpeg 最初是 “Fast Forward MPEG” 的缩写,快速转码(fast forward)MPEG
AV — Audio Video
SW — Software 表示纯CPU实现,用于区别硬件实现
libavformat 媒体文件容器格式的处理库(解析.mp4文件)
libavcodec 编解码器的库
libavdevide 设备操作,摄像头麦克风
libavutil 一些单独的函数
libswrsample 音频格式转换和重采样
libswscale 视频格式转换和缩放
libavfilter 滤镜
AVFrame 表示 位压缩的音视频数据(音频或者视频之一)
c
typedef struct AVFrame {
......
//
// 视频帧图像数据 或者 音频帧PCM数据, 根据不同的格式有不同的存放方式
// 对于视频帧:RGB/RGBA 格式时 data[0] 中一次存放每个像素的RGB/RGBA数据
// YUV420 格式时 data[0]存放Y数据; data[1]存放U数据; data[2]存放V数据
// 对于音频帧: data[0]存放左声道数据; data[1]存放右声道数据
//
uint8_t *data[AV_NUM_DATA_POINTERS];
//
// 行字节跨度, 相当于stride
// 对于视频帧: 上下两行同一列像素相差的字节数,例如:对于RGBA通常是(width*4), 但是有时FFMPEG内部会有扩展, 可能会比这个值大
// 对于音频帧: 单个通道中所有采样占用的字节数
//
int linesize[AV_NUM_DATA_POINTERS];
int format; // 对于视频帧是图像格式; 对于音频帧是采样格式
int64_t pts; // 当前数据帧的时间戳
int width, height; // 仅用于视频帧, 宽度高度
int key_frame; // 仅用于视频, 当前是否是I帧
int sample_rate; // 仅用于音频, 采样率
uint64_t channel_layout; // 仅用于音频, 通道类型
int nb_samples; // 仅用于音频, 样本数量
......
}c
AVFrame *av_frame_alloc(void); // 分配一个数据帧结构
AVFrame *av_frame_clone(const AVFrame *src); // 完整的克隆数据帧结构, 包括其内部数据
void av_frame_free(AVFrame **frame); // 释放数据帧结构及其内部数据
int av_frame_ref(AVFrame *dst, const AVFrame *src); // 增加引用计数
void av_frame_unref(AVFrame *frame); // 减少引用计数AVPacket 表示压缩后的音视频数据
c
typedef struct AVPacket {
......
int64_t pts; // 显示时间戳
int64_t dts; // 解码时间戳 (对于音频来说通常与pts相同)
uint8_t *data; // 实际压缩后的视频或者音频数据
int size; // 压缩后的数据大小
int stream_index; // 流索引值, 在媒体文件中,使用0,1来区分音视频流,可以通过这个值区分当前包是音频还是视频
int flags;
int64_t duration; // 渲染显示时长,对于视频帧比较有用,控制一帧视频显示时长
int64_t pos; // 当前包在流文件中的位置, -1表示未知
......
} AVPacket;c
AVPacket *av_packet_alloc(void); // 分配一个数据包结构体
AVPacket *av_packet_clone(const AVPacket *src); // 完整赋值一个数据包
void av_packet_free(AVPacket **pkt); // 释放数据包结构及其内部的数据
void av_init_packet(AVPacket *pkt); // 初始化数据包结构,可选字段都设置为默认值
int av_new_packet(AVPacket *pkt, int size); // 根据指定大小创建包结构中的数据SwsContext 视频图像转换上下文
关键函数
c
// 创建转换上下文
SwsContext* sws_getContext(
int srcW, int srcH, AVPixelFormat srcFormat, // 输入参数
int dstW, int dstH, AVPixelFormat dstFormat, // 输出参数
int flags, // 缩放算法(如SWS_BILINEAR)
SwsFilter* srcFilter, // 输入滤波器(通常NULL)
SwsFilter* dstFilter, // 输出滤波器(通常NULL)
const double* param // 算法参数(通常NULL)
);
// 执行转换
int sws_scale(
SwsContext* ctx,
const uint8_t* const srcSlice[], // 输入数据指针
const int srcStride[], // 输入行大小
int srcSliceY, // 起始行(通常0)
int srcSliceH, // 处理行数
uint8_t* const dst[], // 输出数据指针
const int dstStride[] // 输出行大小
);SweContext 音频图像转换上下文
avformat_new_stream
在创建或复用媒体文件时,为音频、视频、字幕等流分配并初始化一个 AVStream 结构体。新增一个流(视频/音频/字幕等),自动分配流索引(index)