第 2 章:FFmpeg简介

2.1 历史

历史

一些相关术语介绍:

  • 容器(Container)格式:一种文件封装格式,里边主要包含了流,一般会使用一个特定的后缀名标识,例如.mov、.avi、.wav等。
  • 流 (Stream):在容器中存储音频(Audio)或者视频(Video)、字幕(Subtitle)等数据。
  • 元数据(Metadata):一般位于容器之中,告诉我们一些额外信息,一个常见的例子是MP3文件中的ID3 tag。
  • 编解码器(Codec):它实际上是enCOder与DECoder这两个词的混搭。大部分情况下我们指的是一种压缩标准,如我们所说的AVC/H.254、HEVC/H.265、VVC/H.266、AV1等。

2.2 FFmpeg的基本组成

FFmpeg框架可以简单分为两层,上层是以ffmpeg、ffplay、ffprobe为代表的命令行工具;其底层支撑是一些基础库,包含AVFormat、AVCodec、AVFilter、AVDevices、AVUtils等模块库。细节结构如下图所示:

2.2.1 封装/解封装模块AVFormat

AVFormat中实现了目前多媒体领域中绝大多数媒体封装格式和流媒体协议,包括封装(Muxer)和解封装(Demuxer)器, 包括如:

  • MP4FLVMKVTS文件封装格式,
  • RTMPRTSPMMSHLS等网络协议。

FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。

2.2.2 编/解码模块AVCodec

AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec除了以原生方式支持H.264、AAC、MJPEG等编解码格式之外,还支持第三方的编解码器,如:

  • H.264(AVC)编码,需要使用x264编码器;
  • H.265(HEVC)编码,需要使用x265编码器;
  • MP3(mp3lame)编码,需要使用libmp3lame编码器

2.2.3 滤镜模块AVFilter

AVFilter库提供了一个通用的音、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和输出。滤镜处理的例子如下图

这个例子将输入的视频切割成两部分流,一部分流抛给crop与vflip滤镜处理模块,另一部分保持原样;当crop与vflip处理完后,将流合并到overlay图层中,并显示在最上一层,输出新视频。对应命令如下:

bash 复制代码
ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:00, vflip [flip]; [main] [flip] overlay=0:H/2" OUTPUT

处理前后如下:上半部分保留,上半部分同时做镜像运动到下边,合成后输出。

下面简单说下滤镜的构成规则

  • 相同滤镜的线性链用逗号分割
  • 不同滤镜的线性链使用分号分隔

2.2.4 设备模块AVDevice

AVDevice提供了一些常用的输入输出设备的处理框架。比如在macOS上和iOS上,一般使用AVFoundation调用底层的音视频及共享桌面输入。在Windows上,常用dshow作为音视频输入。在Linux上有更多选择,:音频输入输出设备有oss、alsa等,视频设备有opengl、video4linux2、x11grab等。sdl和sdl2是一个跨平台的输出设备的不同版本,在大多数平台都能用。

2.2.5 图像转换模块swscale

swscale模块提供了底层的图像转换API接口,它允许进行图像缩放和像素格式转换,通常转换是有损的。

2.2.6 音频转换模块swresmaple

swresample模块提供了音频重采样、格式转换、Rematrixing(改变通道布局)等

2.2.7 编解码工具ffmpeg

  • 解封装,或称解复用
  • 解码
  • 编码
  • 封装,或称复用

其中,整体处理的工作流程如下图所示。

2.2.8 播放器ffplay

ffmplay主要作为播放测试工具使用,也能显示音频的波形信息等。注意编译安装ffplay依赖于sdl。

2.2.9 多媒体分析器ffprobe

ffprobe是一个强大的多媒体分析工具,可以从媒体文件或者媒体流中获取音频格式,视频宽高,时长等信息。下一章具体讲。

2.3 不同平台的编译

建议谷歌

2.4 FFmpeg特性选择与定制

使用configure --help查看第三方外部库支持

复制代码
./configure --list -encoders 查看编码器
./configure --list -decoders 查看解码器
./configure --list -muxers 查看封装支持
./configure --list -demuxers 查看解封装支持
./configure --list -protocols 查看通信协议
相关推荐
luoqice1 天前
RTMP视频流的帧格式分析
网络·ffmpeg
老姚---老姚2 天前
编译支持HEVC/H.265 over RTMP / Enhanced RTMP 的 ffmpeg
ffmpeg·h.265·hevc·rtmp·enhanced
码流怪侠3 天前
FFmpeg 开发实战全解析:从入门到精通(附完整代码示例)
ffmpeg·音视频开发·视频编码
圆弧YH3 天前
FFmpeg
ffmpeg
luoqice3 天前
FLV文件格式详解
ffmpeg
happybasic4 天前
在CMD下使用FFmpeg将.wav文件转换成指定的格式~
ffmpeg
shao9185164 天前
第10章 Streaming(上):初级音频应用(1)——项目三:自建服务器的Mini-Omni实时语音聊天机器人
ffmpeg·whisper·asr·mini-omni·自建语音服务器
Leon_Chenl5 天前
【已开源】【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统
深度学习·opencv·yolo·ffmpeg·音视频·边缘计算·人脸识别+检测
antzou5 天前
视频图片/文字水印
ffmpeg·视频水印·批量水印
AC赳赳老秦6 天前
DBA 专属方案:用 OpenClaw 实现 SQL 语句优化、慢查询分析、数据库备份巡检全自动化
服务器·前端·数据库·ffmpeg·自动化·deepseek·openclaw