作为开发者,使用 FFmpeg 主要分两部分:命令行工具和接口使用,本文讲解如何在 macOS 上编译 FFmpeg,以及 FFmpeg 命令行工具使用的一些基本概念。

Editing Video

编译

针对 macOS 平台来编译。

首先需要安装 Xcode,这样才有编译工具链 LLVM。

然后需要安装汇编编译工具,Yasm 或者 NASM

wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xvzf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
make install
brew install nasm

如果希望通过 ffplay 来播放音视频文件,还需要安装 SDL

brew install sdl2

在编译 FFmpeg 前,可以通过如下命令来配置要支持和禁用的一些功能模块:

./configure --disable-xxx --enable-xxx

查看有哪些编码格式:

./configure --list-encoders
./configure --list-decoders

查看有哪些文件封装格式:

./configure --list-muxers
./configure --list-demuxers

查看有哪些流媒体传输协议:

./configure --list-protocols

最后编译 FFmpeg:

make
make install

命令行工具

官方文档

其他资料

命令行工具的介绍

  • ffmpeg 音视频编解码。
  • ffplay 音视频播放和可视化分析,对于视频播放器,不得不提的一个问题就是音画同步,在 ffplay 中音画同步的实现方式其实有三种,分别是:
    • 以音频为主时间轴作为同步源;
    • 以视频为主时间轴作为同步源;
    • 以外部时钟为主时间轴作为同步源。
  • ffprobe 音视频内容分析。

命令基本格式

ffmpeg [global options] [input file options] -i input_file [output file options] output_file
ffmpeg -y -i video.avi -s vga video.mp4

显示输出预览

需要先安装 Simple DirectMedia Layer,简称 SDL。这样就可以不用先将输入文件转换为输出文件后,再播放输出文件来看效果。

ffmpeg -f lavfi -i rgbtestsrc -pix_fmt yuv420p -f sdl Example

转码的工作流程

工作流程:读取文件、解封装、解码、转换参数或经过过滤器、编码、封装、写入文件。

FFmpeg Transcoding

过滤器、过滤器链、过滤器图

简单过滤器

FFmpeg Simple Filter

ffplay -f lavfi -i testsrc -vf transpose=1

复杂过滤器

FFmpeg Complex Filter

ffmpeg -i liveshow.mp4 -i lighthouse.png -filter_complex overlay=w output.mp4

一个过滤器图由多个过滤器链组成,通过 ; 分割,一个过滤器链由多个过滤器组成,通过 , 分割。

下面的示例,第 1 个过滤器链将输入分割成 [a] 和 [b],第 2 个过滤器链将 [a] 通过 pad 处理变成 [1],第 3 个过滤器链将 [b] 通过 vflip 处理变成 [2],第 4 个过滤器链将 [1] 和 [2] 合并为一个画面:

ffplay -f lavfi -i rgbtestsrc -vf "split[a][b];[a]pad=2*iw[1];[b]vflip[2];[1][2]overlay=w"

流选择

一个视频文件可能包含多路流,通过 -map 去选择流,文件序号:流类型:流序号,序号从 0 开始,流类型有 a 视频、d 数据、s 字幕、t 附件、v 视频。

ffplay -i A.mov -i B.mov -i C.mov -map 0:v:0 -map 1:a:0 -map 2:s:0 clip.mov

指定数据大小

比特大小

ffmpeg -i input.avi -b:v 1500000 output.mp4
ffmpeg -i input.avi -b:v 1500K output.mp4
ffmpeg -i input.avi -b:v 1.5M output.mp4
ffmpeg -i input.avi -b:v 0.0015G output.mp4

字节大小

ffmpeg -i input.mpg -fs 10MB output.mp4

指定颜色

格式为 0xRRGGBB[@AA] 和 #RRGGBB[@AA],@ 后面的代表透明度。还有内建的如 red, black 等这样的颜色名称。

Lavfi 虚拟设备

通过 Lavfi 虚拟设备产生输入视频。

ffplay -f lavfi -i smptebars

ffplay -f lavfi -i color=c=blue