FFmpeg 小记
来源:互联网 发布:计算机一级软件 编辑:程序博客网 时间:2024/05/19 17:49
FFmpeg是什么(官网传送)
A complete, cross-platform solution to record, convert and stream audio and video.——官网
FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——一个音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。——wikipedia
组成
- ffmpeg——一个命令行工具,用来对视频文件转换格式,也支持对电视卡即时编码
- ffserver——一个HTTP多媒体即时广播流服务器,支持时光平移
- ffplay——一个简单的播放器,基于SDL与FFmpeg库
- libavcodec——包含全部FFmpeg音频/视频编解码库
- libavformat——包含demuxers和muxer库
- libavutil——包含一些工具库
- libpostproc——对于视频做前处理的库
- libswscale——对于视频作缩放的库
关键结构体
分类
解协议(http, rtsp, rtmp, mms)
AVIOContext
,URLProtocol
,URLContext
主要存储视音频使用的协议的类型以及状态。 URLProtocol
存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol
结构。(注意:FFMPEG中文件也被当做一种协议“file”)
解封装(flv, avi, rmvb, mp4, …)
AVFormatContext
: Format I/O context, 主要存储视音频封装格式中包含的信息; AVInputFormat
存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat
结构。
解码(h264, mpeg2, aac, mp3, …)
AVStream
存储一个视频/音频流的相关数据;
每个AVStream
对应一个AVCodecContext
,存储该视频/音频流使用解码方式的相关数据;
每个AVCodecContext
中对应一个AVCodec
,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec
结构。
存数据
视频的话,每个结构一般是存一帧;音频可能有好几帧
解码前数据:AVPacket
解码后数据:AVFrame
主要结构
AVFrame
位于frame.h
,一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV,RGB,对音频来说是PCM),此外还包含了一些相关的信息。
主要fields:
uint8_t *data[AV_NUM_DATA_POINTERS]:解码后原始数据(对视频来说是YUV,RGB,对音频来说是PCM)int linesize[AV_NUM_DATA_POINTERS]:data中“一行”数据的大小。注意:未必等于图像的宽,一般大于图像的宽。int width, height:视频帧宽和高(1920x1080,1280x720...)int nb_samples:音频的一个AVFrame中可能包含多个音频帧,在此标记包含了几个int format:解码后原始数据类型(YUV420,YUV422,RGB24...)int key_frame:是否是关键帧enum AVPictureType pict_type:帧类型(I,B,P...)AVRational sample_aspect_ratio:宽高比(16:9,4:3...)int64_t pts:显示时间戳int coded_picture_number:编码帧序号int display_picture_number:显示帧序号int8_t *qscale_table:QP表uint8_t *mbskip_table:跳过宏块表int16_t (*motion_val[2])[2]:运动矢量表uint32_t *mb_type:宏块类型表short *dct_coeff:DCT系数,这个没有提取过int8_t *ref_index[2]:运动估计参考帧列表(貌似H.264这种比较新的标准才会涉及到多参考帧)int interlaced_frame:是否是隔行扫描uint8_t motion_subsample_log2:一个宏块中的运动矢量采样个数,取log的
AVFormatContext
它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。主要变量作用
struct AVInputFormat *iformat:输入数据的封装格式AVIOContext *pb:输入数据的缓存unsigned int nb_streams:视音频流的个数AVStream **streams:视音频流char filename[1024]:文件名int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)int bit_rate:比特率(单位bps,转换为kbps需要除以1000)AVDictionary *metadata:元数据
AVCodecContext
用于解码时的关键变量
enum AVMediaType codec_type:编解码器的类型(视频,音频...)struct AVCodec *codec:采用的解码器AVCodec(H.264,MPEG2...)int bit_rate:平均比特率uint8_t *extradata; int extradata_size:针对特定编码器包含的附加信息(例如对于H.264解码器来说,存储SPS,PPS等)AVRational time_base:根据该参数,可以把PTS转化为实际的时间(单位为秒s)int width, height:如果是视频的话,代表宽和高int refs:运动估计参考帧的个数(H.264的话会有多帧,MPEG2这类的一般就没有了)int sample_rate:采样率(音频)int channels:声道数(音频)enum AVSampleFormat sample_fmt:采样格式int profile:型(H.264里面就有,其他编码标准应该也有)int level:级(和profile差不太多)
AVIOContext
FFMPEG管理输入输出数据的结构体。主要变量:
unsigned char *buffer:缓存开始位置int buffer_size:缓存大小(默认32768)unsigned char *buf_ptr:当前指针读取到的位置unsigned char *buf_end:缓存结束的位置void *opaque:URLContext结构体
AVCodec
存储编解码器信息的结构体,主要变量:
const char *name:编解码器的名字,比较短const char *long_name:编解码器的名字,全称,比较长enum AVMediaType type:指明了类型,是视频,音频,还是字幕enum AVCodecID id:ID,不重复const AVRational *supported_framerates:支持的帧率(仅视频)const enum AVPixelFormat *pix_fmts:支持的像素格式(仅视频)const int *supported_samplerates:支持的采样率(仅音频)const enum AVSampleFormat *sample_fmts:支持的采样格式(仅音频)const uint64_t *channel_layouts:支持的声道数(仅音频)int priv_data_size:私有数据的大小
AVStream
存储每一个视频/音频流信息的结构体。主要变量
int index:标识该视频/音频流AVCodecContext *codec:指向该视频/音频流的AVCodecContext(它们是一一对应的关系)AVRational time_base:时基。通过该值可以把PTS,DTS转化为真正的时间。FFMPEG其他结构体中也有这个字段,但是根据我的经验,只有AVStream中的time_base是可用的。PTS*time_base=真正的时间int64_t duration:该视频/音频流长度AVDictionary *metadata:元数据信息AVRational avg_frame_rate:帧率(注:对视频来说,这个挺重要的)AVPacket attached_pic:附带的图片。比如说一些MP3,AAC音频文件附带的专辑封面。
AVPacket
存储压缩编码数据相关信息的结构体,主要变量
uint8_t *data:压缩编码的数据。例如对于H.264来说。1个AVPacket的data通常对应一个NAL。注意:在这里只是对应,而不是一模一样。他们之间有微小的差别:使用FFMPEG类库分离出多媒体文件中的H.264码流因此在使用FFMPEG进行视音频处理的时候,常常可以将得到的AVPacket的data数据直接写成文件,从而得到视音频的码流文件。int size:data的大小int64_t pts:显示时间戳int64_t dts:解码时间戳int stream_index:标识该AVPacket所属的视频/音频流。
其他资料
流媒体系统对比
封装格式对比
视频编码器对比
音频编码格式对比
视频播放器对比
参考资料
FFMPEG中最关键的结构体之间的关
- FFMPEG小记
- FFmpeg 小记
- ffmpeg使用小记
- FFmpeg使用小记
- ffmpeg 使用小记
- FFmpeg使用小记
- ffmpeg+ffserver媒体服务搭建小记
- ffmpeg+ffserver媒体服务搭建小记
- ffmpeg+ffserver媒体服务搭建小记
- ffmpeg+ffserver媒体服务搭建小记
- ffmpeg+ffserver媒体服务搭建小记
- ffmpeg for mac osx 64bit 小记
- ffmpeg 使用小记 h264 to ts
- ubuntu下折腾ffmpeg小记(音视频录制、转换)
- 小记
- 小记
- 小记
- 小记
- 刷题笔记:C/C++专项练习4
- 给出年月日,计算该日是该年的第几天
- c++重载,重写/覆盖,重定义/隐藏
- SpringBoot学习5之自定义注解
- sqlmap初级
- FFmpeg 小记
- 图的广度优先搜索
- pip的安装与基本使用方法
- CMake源码编译(cmake升级)
- 1.3 选择排序(简单排序、堆排序)
- DAY2之Python每日练习题
- 数字根源
- SpringBoot项目设置热部署以及静态资源livereload
- RecyclerView的Item单击事件&长按事件(自定义接口回调)