FFmpeg 安装与编译
FFmpeg 是极其易用的多媒体处理工具。目前广泛使用的各大视频、音频、字幕、图像的编码、格式、封装,它都良好支持。
在 Linux/MacOS 下,使用很容易。以 Mac 为例,使用 brew 包管理安装即可:
brew install ffmpeg
不过,部分编码器和 FFmpeg 协议存在冲突,分发他们存在法律风险。故需要手动编译。
Mac 下,可以使用此 TAP
源,只需要类似
brew install hombrew-ffmpeg/ffmpeg/ffmpeg --with-<option1>
的格式,就能够自动编译。具体内容,自行查看即可,不作赘述。
FFmpeg 命令行介绍
FFmpeg 命令行有三大指令:
- ffmpeg 转码工具
- ffprobe 信息查看工具
- ffplay 播放工具
ffmpeg 命令格式为:
ffmpeg [全局参数] {[输入文件参数] -i [输入文件路径]} ... {[输出文件参数] 输出文件路径}
例如:
ffmpeg \ # 可以使用 \ 跨行书写
-y # 全局参数 文件名相同时覆盖, 对应的是 -n 不覆盖
-c:v libx264 -c:a aac \ # 输入文件参数 设置解码器, 但多数情况下此行没有必要, ffmpeg 会自动推断
-i input.mp4 \ # 输入文件
-c:v libx265 -r 24 -c:a copy \ # 输出文件参数 设置编码器及参数; -r 设置输出帧数
output.mkv # 输出文件路径
基本概念
封装与编码
封装
- 又叫容器(Container),仅规定如何存放,能存放什么,以及一些基本的规范(编码信息、时间定位等),高度抽象。和面向对象的封装概念不谋而合,具体实现不是容器管辖的范围。
- 常见的封装有
- AVI,微软研发,已逐渐退出历史舞台。
- MOV,Quicktime 标准,Apple 研发,无损格式常用,对透明通道支持较好。
- MP4,MPEG4 标准,如今最广泛实用的封装。
- Matroska,常用后缀有
[mkv(视频), mka(仅音频), mks(仅字幕)]
,标准极其宽泛,几乎所有编码都能容纳。但也因此没有广泛使用。对多轨支持较好。 - FLV,Flash 视频,有类似 Matroska 的宽泛标准,常用于网络传输(flv.js)……但如今仍在使用的,几乎都兼容 MP4.
- WebM,Google 开发的视频文件格式,使用 BSD 许可证,无需支付专利费。VP9、AV1、Ogg、Opus 等自由编码为其所用。
- 使用
ffmpeg -formats
查看 FFmpeg 支持的容器。
Muxer/Demuxer
- 对应的中文翻译是混路器和分路器,但不常用。常用的是动词形式:封装、解封装、重封装。
- 可以连起来叫 Remuxer.
- 很容易理解,有封装自然就有其对应的方法。就如同压缩和解压缩一样。
- 如果两个封装格式兼容,转换是很快的。例如,FLV(H.264 视频,AAC 音频) 到 MP4。重封装的资源消耗几乎和复制相同。
- 编码
- 编码(Encoding),是为了减少文件大小的必要过程。而使用的编码标准(Codec)各异,压缩率自然各异。
- 常见视频编码
- H.264(AVC, Advanced Video Coding),如今最常用的视频编码。同样是由 MPEG 制定的标准。
- H.265(HEVC, High Efficiency Video Coding),H.264 的后进者,拥有更强大的压缩性能和画面表现。和 4K,HDR 等息息相关。
- VP8 & VP9,Google 主导的编码格式,无专利费。YouTube 可能是其最大的使用者。
- AV1,AOMedia 创建,VP9 的下一代标准,无专利费。作为 2018 年的新新格式,有着比 H.265 更优秀的性能。但目前使用并不广泛,特别是编码器尚不成熟。
- 常见音频编码
- AAC(Advanced Audio Coding),如今最常用的音频编码。MPEG 制定。常和 H.264,H.265 共同构成 MP4 视频。
- MP3,流行音频编码之一。许多平台仍在使用。
- OGG/Opus,Vorbis 家族的编码。
- WAV,无损格式,常用于音频编辑。但容量巨大。
- FLAC(Free Lossless Audio Codec),无损格式,相较于 WAV,压缩率大为提高。
- 使用
ffmpeg -codecs
查看 FFmpeg 支持的编码。
- 编码器(Encoder)/解码器(Decoder)
- 编码和解码都比封装更耗资源。
- 因此重编码往往十分耗时。
颜色
色彩模型
- 量化色彩的模型。
- 常用的色彩模型
- RGB,通过红绿蓝三原色叠加,表示颜色。常用于屏幕显示。可以表示为浮点、8bit 数字、十六进制、16bit 数字等不同精度和形式。
- CMYK,通过青(Cyan)、洋红(Magenta)、黄(Yellow)、黑(blacK)四色叠加,表示颜色。常用于印刷。
- YUV,拥有三个色彩分量,分别是:Y,表示明亮度(Luminance, Luma);U、V分别表示色度(Chrominance, Chroma). Y 和 UV 分量可以分离,也就是说,不必全都无损采样。因为人眼对亮度最为敏感,而对色度感知较弱。故不必对 UV 全采样。可以半采样或四分之一采样。减小传输和储存负担。具体内容可能以后专门出文章再提。
色彩空间
色彩的组织方式,定义色彩。
常见色彩空间
- CIELAB,有时称为 L*a*b* 或者不规范的 Lab,是一种绝对色彩空间,基于人类视锥细胞敏感度构建,涵盖所有人眼可见色彩。但其定义是基于知觉的,也就是说,它必然作为一种中间件,而不是储存或分发格式(因为)。最常用于色域转换和调色。
- sRGB(standard Red Green Blue),是惠普与微软共同开发的一种标准 RGB 色彩空间。如今是显示设备的基本标准。如果显示设备连 sRGB 都不能 99% 支持,那么是时候换新了。
- AdobeRGB,有时称为 aRGB,比 sRGB 更广。能够覆盖 sRGB 所不能覆盖的 CMYK 色彩模型。因此,常用于印刷领域。
各色彩空间范围对比
上图源自 Wikimedia, 作者 Jeff Schewe, 请遵循 CC BY 2.5 转载。
色彩深度
简称色深。计量单位为 bit,即一位二进制。
若有 \(n\) 位二进制数,那么就能表示 \(2^n\) 个数。前面说过,RGB 通过红绿蓝三原色叠加,表示颜色。其能表示的颜色,就受每个分量(或者说通道)的精度所限制。
常见色彩深度
- 8 bit 精度下,即,每通道有 \(2^8=256\) 阶灰度。一共能表示 \((2^8)^3=2^{24}=16,777,216\) 种颜色,常称数千万种颜色;又可以根据单通道精度,称为 8 bit 色深;再或者根据所有通道的总和,称为 24 bit 色深。
- 同理,\((2^{10})^3=2^{30}=1,073,741,824\). 可称 10 bit 色深、30 bit 色深、超亿种颜色。
- 再者,\((2^{12})^3=2^{36}= 68,719,476,736\) 以此类推。
- 若考虑透明通道,又有 \((2^8)^4=2^{32}\), \((2^{10})^{4}=2^{40}\) etc.
在图像领域,色深高是不怎么稀奇的事。但由于显示器限制,在分发时,常导出为 8bit 或 10bit 色深图像。
各色深对比
下一篇 FFmpeg 入门与实践 002