1、ffmpeg命令行工具
ffmpeg提供了三个工具ffmpeg.exe,ffplay.exe,ffprobe.exe,可以在官网http://ffmpeg.org/下载。(以windows平台为例)该网站中的FFMPEG分为3个版本:
-
Static
只有三个程序 ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll已经被编译到exe里面去了 -
Shared
除了三个程序 ffmpeg.exe,ffplay.exe,ffprobe.exe, 还有一些dll,比如avcodec-xx.dll、avformat-xx.dll等。 -
Dev
开发库,提供了头文件xxx.h和库文件.lib(dll从Shared 中获取)
ffmpeg命令行使用介绍
-
ffmpeg用于转码
使用方法可以参考:ffmpeg参数中文详细解释
详细的使用说明(英文):http://ffmpeg.org/ffmpeg.html -
ffplay是用于播放
使用方法可以参考:ffplay的快捷键以及选项
详细的使用说明(英文):http://ffmpeg.org/ffplay.html -
ffprobe是用于查看文件格式
使用说明(英文):http://ffmpeg.org/ffprobe.html
2、ffmpeg开发库
上一节中,已经说明官方编译好的库获取方式
- 下载Dev版本,里面包含了ffmpeg的xxx.h头文件以及xxx.lib库文件。
- 下载Shared版本,里面包含了ffmpeg的dll文件。
将这两部分文件配置到VC工程下面就可以。如果有特殊要求进行裁剪,需下载源代码编译,指定编译选项。
2.1、ffmpeg开发库简介
FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtils等模块库,源代码中的模块如下:
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
libavcodec:用于各种类型声音/图像编解码。该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能, libavcodec 库被其他各大解码器 ffdshow, Mplayer 等所包含或应用。
libavdevice : 硬 件 采 集 、 加 速 、 显 示 。 操 作 计 算 机 中 常 用 的 音 视 频 捕 获 或 输 出 设 备 :ALSA,AUDIO_BEOS,JACK,OSS,1394, VFW。
libavfilter: filter(FileIO、 FPS、 DrawText) 音视频滤波器的开发,如宽高比 裁剪 格式化 非格式化 伸缩。
libavutil:包含一些公共的工具函数的使用库,包括算数运算 字符操作。
libavresample:音视频封转编解码格式预设等。
libswscale:(原始视频格式转换) 用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565、rgb888 等与 yuv420 等之间转换。
libswresample:原始音频格式转码。
libpostproc:(同步、时间计算的简单算法) 用于后期效果处理;音视频应用的后处理,如图像的去块效应。
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等。
ffsever:一个 HTTP 多媒体即时广播串流服务器。
ffplay:是一个简单的播放器,使用 ffmpeg 库解析和解码,通过 SDL 显示。
2.2、FFmpeg中的数据结构
FFMPEG中结构体很多。最关键的结构体可以分成以下几类:
a) 协议(http,rtsp,rtmp,mms)
AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)
b) 封装(flv,avi,rmvb,mp4)
AVFormatContext主要存储视音频封装格式中包含的信息。AVInputFormat存储输入视音频使用的封装格式,每种视音频封装格式都对应一个AVInputFormat 结构;同理,AVOutputFormat存储输出视音频使用的封装格式,每种视音频封装格式都对应一个AVInputFormat 结构。
c) 编解码(h264,mpeg2,aac,mp3)
每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。
d) 存数据
视频的话,每个结构一般是存一帧;音频可能有好几帧
对于解码过程:解码前数据:AVPacket,解码后数据:AVFrame
对于编码过程:编码前数据:AVFrame,编码后数据:AVPacket
以上几种结构对应的关系图如下
基本结构体和参数的简要介绍
AVFormatContext
封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装 格式相关信息。
iformat:输入视频的AVInputFormat
nb_streams :输入视频的AVStream 个数
streams :输入视频的AVStream []数组
duration :输入视频的时长(以微秒为单位)
bit_rate :输入视频的码率
AVInputFormat
每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。
name:封装格式名称
long_name:封装格式的长名称
extensions:封装格式的扩展名
id:封装格式ID
AVStream
视频文件中每个视频(音频)流对应一个该结构体。
id:序号
codec:该流对应的AVCodecContext
time_base:该流的时基
r_frame_rate:该流的帧率
AVCodecContext
编码器上下文结构体,保存了视频(音频)编解码相关信息。
codec:编解码器的AVCodec
width, height:图像的宽高(只针对视频)
pix_fmt:像素格式(只针对视频)
sample_rate:采样率(只针对音频)
channels:声道数(只针对音频)
sample_fmt:采样格式(只针对音频)
AVCodec
每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。
name:编解码器名称
long_name:编解码器长名称
type:编解码器类型
id:编解码器ID
AVPacket
存储一帧压缩编码数据。
pts:显示时间戳
dts :解码时间戳
data :压缩编码数据
size :压缩编码数据大小
stream_index :所属的AVStream
AVFrame
存储一帧解码后像素(采样)数据。
data:解码后的图像像素数据(音频采样数据)。
linesize:对视频来说是图像中一行像素的大小;对音频来说是音频帧的大小。
width, height:图像的宽高(只针对视频)。
key_frame:是否为关键帧(只针对视频) 。
pict_type:帧类型(只针对视频) 。例如I,P,B。
FFMPEG结构体分析:AVIOContext
FFMPEG结构体分析:AVFormatContext
FFMPEG结构体分析:AVCodecContext
FFMPEG结构体分析:AVCodec
FFMPEG结构体分析:AVFrame
FFMPEG结构体分析:AVPacket
FFMPEG结构体分析:AVStream
2.3、源码分析
注意ffmpeg的源代码只有在linux下才能编译,在windows下可以使用MinGW进行编译,有一个很完整的ffmpeg源代码的分析文档:ffdoc
FFmpeg的库函数源代码分析文章列表如下:
【架构图】
FFmpeg源代码结构图 - 解码
FFmpeg源代码结构图 - 编码
【通用】
FFmpeg 源代码简单分析:av_register_all()
FFmpeg 源代码简单分析:avcodec_register_all()
FFmpeg 源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
FFmpeg 源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
FFmpeg 源代码简单分析:avio_open2()
FFmpeg 源代码简单分析:av_find_decoder()和av_find_encoder()
FFmpeg 源代码简单分析:avcodec_open2()
FFmpeg 源代码简单分析:avcodec_close()
【解码】
图解FFMPEG打开媒体的函数avformat_open_input
FFmpeg 源代码简单分析:avformat_open_input()
FFmpeg 源代码简单分析:avformat_find_stream_info()
FFmpeg 源代码简单分析:av_read_frame()
FFmpeg 源代码简单分析:avcodec_decode_video2()
FFmpeg 源代码简单分析:avformat_close_input()
【编码】
FFmpeg 源代码简单分析:avformat_alloc_output_context2()
FFmpeg 源代码简单分析:avformat_write_header()
FFmpeg 源代码简单分析:avcodec_encode_video()
FFmpeg 源代码简单分析:av_write_frame()
FFmpeg 源代码简单分析:av_write_trailer()
【其它】
FFmpeg源代码简单分析:日志输出系统(av_log()等)
FFmpeg源代码简单分析:结构体成员管理系统-AVClass
FFmpeg源代码简单分析:结构体成员管理系统-AVOption
FFmpeg源代码简单分析:libswscale的sws_getContext()
FFmpeg源代码简单分析:libswscale的sws_scale()
FFmpeg源代码简单分析:libavdevice的avdevice_register_all()
FFmpeg源代码简单分析:libavdevice的gdigrab
【脚本】
FFmpeg源代码简单分析:makefile
FFmpeg源代码简单分析:configure
偏底层的libavcodec的源代码分析文章列表如下:
【解码- libavcodec H.264 解码器】
FFmpeg的H.264解码器源代码简单分析:概述
FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分
FFmpeg的H.264解码器源代码简单分析:解码器主干部分
FFmpeg的H.264解码器源代码简单分析:熵解码(EntropyDecoding)部分
FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧内宏块(Intra)
FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)
FFmpeg的H.264解码器源代码简单分析:环路滤波(LoopFilter)部分
【解码-libavcodec HEVC 解码器】
FFmpeg的HEVC解码器源代码简单分析:概述
FFmpeg的HEVC解码器源代码简单分析:解析器(Parser)部分
FFmpeg的HEVC解码器源代码简单分析:解码器主干部分
FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTUDecode)部分-PU
FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-TU
FFmpeg的HEVC解码器源代码简单分析:环路滤波(LoopFilter)