Back
Featured image of post FFmpeg 入门与实践 001

FFmpeg 入门与实践 001

FFmpeg 是极其易用的多媒体处理工具。本篇介绍其基本用法。

FFmpeg 系列文章导航页

FFmpeg 安装与编译

FFmpeg 是极其易用的多媒体处理工具。目前广泛使用的各大视频、音频、字幕、图像的编码、格式、封装,它都良好支持。

在 Linux/MacOS 下,使用很容易。以 Mac 为例,使用 brew 包管理安装即可:

brew install ffmpeg

不过,部分编码器和 FFmpeg 协议存在冲突,分发他们存在法律风险。故需要手动编译。

Mac 下,可以使用此 TAP 源,只需要类似 brew install hombrew-ffmpeg/ffmpeg/ffmpeg --with-<option1> 的格式,就能够自动编译。具体内容,自行查看即可,不作赘述。

FFmpeg 命令行介绍

FFmpeg Documentation

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 # 输出文件路径

基本概念

封装与编码

FFmpeg Codecs Documentation

  • 封装

    • 又叫容器(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

comments powered by Disqus