背景
移动端学习音视频开发,FFmpeg可以说是必学的框架,FFmpeg在linux平台下开发,但它同样也可以在其他操作系统环境中编译运行,包括Windows、Mac OS X等。FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,它包括了目前领先的音/视频编码库libavcodec。
FFmpeg有非常强大的功能,包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。
适用场景
本文讲述Mac终端自动,手动编译FFmpeg库,对于Mac终端而言,最终生成二进制文件(ex: ffmpeg,ffplay...)
安装方式
可以通过如下三种方式安装ffmpeg
- 终端安装 (借助homebrew): 此方式ffmpeg会保持自动更新.
- 下载ffmpeg静态库: 即不用手动编译,我们只需要直接运行下载得到的二进制文件即可.静态生成的一个缺点是必须手动执行更新。此外, 它们可能不包含所需的所有编码器或筛选器。
- 手动编译: 下载源码, 然后使用所需的标志(可以指定开启需要的功能)运行
./configure
, 最后使用make
或make install
。但是, 必须手动设置配置选项, 并且您需要自己安装第三方库。
如何选择
- 如果仅仅是想使用命令行的ffmepg, 建议用第一种方式或第二种方式.
- 如果需要在Mac OS项目中使用ffmpeg, 以及修改一些ffmpeg中的源码以适应项目,使用第三种方式.
具体步骤
1. 使用终端安装FFmpeg
1.1. 借助Homebrew
安装FFmpeg
- 安装
Homebrew
Homebrew
是命令行中的软件包安装器.绝大多数知名软件包或插件都可以用它来安装. 如果你还没有安装,直接用下面的命令可以安装
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
-
安装
FFmpeg
- 通用版本
brew install ffmpeg
- 最新版本, 并提供最少的配置 (和库依赖关系) 选项。
brew install ffmpeg --HEAD
扩展安装
还可以自定义安装公式,如下,可根据自己需求自行扩展,可能会失败,因为需要一些依赖第三方库
brew install ffmpeg --with-fdk-aac --with-tools --with-ffplay --with-freetype --with-libass --with-libvorbis --with-opus --with-libvpx --with-x265
1.2. 安装第三方库中的ffmpeg
v 2.0版本之后,Homebrew
不再为其核心公式提供选项。想要使用其他库 (包括非免费库) 构建 ffmpeg 的用户需要使用来自第三方存储库的ffmpeg。这些库不是由Homebrew
维护的。
例如:
brew tap varenc/ffmpeg
brew install varenc/ffmpeg/ffmpeg
1.3. 更新
更新需要根据上面安装步骤中是使用通用版本还是最新版本
- 通用版本
brew update && brew upgrade ffmpeg
- 最新版本
brew upgrade --fetch-HEAD ffmpeg
注意: 如果你已经使用
brew install ffmpeg
安装了ffmpeg,可以使用brew uninstall ffmpeg
卸载
2. 手动编译
2.2. 编译环境 - Xcode
手动编译Mac上必须安装Xcode,然后安装命令行工具
- 界面安装:
Preferences > Downloads > Components
- 命令行安装:
xcode-select --install
2.1. 安装依赖库
2.1.1. 自动安装依赖库
$ brew install automake fdk-aac git lame libass libtool libvorbis libvpx \
opus sdl shtool texi2html theora wget x264 x265 xvid nasm
2.1.2. 手动安装依赖库
FFmpeg的编译依赖于Pkg-config
,而它又依赖于GLib
,而GLib
又依赖于gettext
,所以必须先安装并编译相关依赖。
- Pkg-config & GLib & gettext
-
gettext: 在库中编辑文件
stpncpy.c
,并且在#ifndef weak_alias
之前添加#undef stpncpy
.
LIBFFI_CFLAGS=-I/usr/include/ffi LIBFFI_LIBS=-lffi ./configure;make && sudo make install
- glib: Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性。
- Pkg-config : 维护了一个保存各个代码库的路径的数据库。当然这个”数据库” 非常的简单,其实就是一个特殊的目录,这个目录中有一系列的以 “.pc” 为后缀的文件。
GLIB_CFLAGS="-I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include" GLIB_LIBS="-lglib-2.0 -lgio-2.0" ./configure --with-pc-path="/usr/X11/lib/pkgconfig:/usr/X11/share/pkgconfig:/usr/lib/pkgconfig:/usr/local/lib/pkgconfig"
-
gettext: 在库中编辑文件
Mac OS X Lion拥有自己的
stpncpy
函数它跟gettext
重复产生冲突。
- Nasm
Nasm是x264所需的汇编程序。最新版本可在nasm.us上获得。
- 附加的库
- x264: --enable-gpl --enable-libx264
- fdk-aac: --enable-libfdk-aac
- libvpx: --enable-libvpx
- libvorbis: --enable-libvorbis
- libopus:
- LAME:--enable-libmp3lame
- libass:--enable-libass
2.3. Freetype
macOS已经安装了freetype(较老的版本可能需要在安装期间选择X11),但不是在典型的位置
在freetype的./configure
文件中加入如下指令
CFLAGS=`freetype-config --cflags`
LDFLAGS=`freetype-config --libs` PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig:/opt/X11/lib/pkgconfig
2.4. 编译
做完以上所有依赖操作后,就可以链接下载FFmpeg源代码。可以通过Generic compilation guide查阅详细的编译步骤.
运行./configure --help
,可以了解可用的选项。
- 下载
$ git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
$ cd ffmpeg
- 编译
- 完整编译
$ ./configure --prefix=/usr/local --enable-gpl --enable-nonfree --enable-libass \ --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame \ --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libopus --enable-libxvid \ --samples=fate-suite/ make
- 最简编译
$ ./configure && make
- 安装
sudo make install
至此,FFmpeg安装成功.
注意: 以上过程如果报错,需要另行解决,因为ffmpeg版本及其依赖库的版本在不断升级,所以可能会产生一些无法预料的问题,可根据提示另行解决.
3. 手动编译详解
3.1. 原因
ffmpeg库的可以有很多种来源,如官方自动编译好的库或是网上个人或第三方软件中自带的编译好的库.但这些库有以下一些缺点
- 老版本的二进制包已过时,其中包含严重错误或缺少必需的功能,这些功能在新版本中才修复。
- 不能自定义编译,例如获取特定于平台的优化或链接二进制包中不支持的特定库。
- 不能更改源码,例如需要通过更改源码以让ffmpeg实现定制化的需求.
3.2. 步骤
- 配置脚本 (编辑脚本文件./configure)
- 编译 (make)
- 安装 (make install)
1>. 配置: 允许创建编译步骤所需的必要文件,并通过源包通常提供的配置脚本完成。在配置期间,可以定义安装前缀和已启用的组件。
2>. 编译: 编译通常包括在配置步骤完成后运行make。在此阶段,将生成所需的库和二进制文件。
3> 安装: 安装将在配置步骤中指定的路径中安装二进制文件和库。请注意,由于您可以使用编译路径中编译的二进制文件,因此不需要执行此步骤。
./configure
make
make install
注意: 编译源目录中的文件,并将库安装在/ usr / local中。第三步可能需要超级用户权限(因此可能需要由sudo make install替换),因为普通用户无法修改/ usr / local。
3.3. 安装路径
配置步骤通常允许用户指定所谓的安装前缀,并且通常通过配置选项configure --prefix = PREFIX指定,其中PREFIX通常默认为/ usr / local。前缀指定安装所有组件的公共目录。
安装中通常涉及以下目录:
- PREFIX/bin: 包含生成的二进制文件 (e.g. ffmpeg, ffplay, ffprobe etc. in the case of FFmpeg)
- PREFIX/include: 包含生成库的头文件 (e.g. libavutil/avstring.h, libavcodec/avcodec.h, libavformat/avformat.h etc. in case of FFmpeg)
- PREFIX/lib:包含生成的库 (e.g. libavutil, libavcodec, libavformat etc. in the case of FFmpeg)
- PREFIX/share: 包含各种与系统无关的组件;特别是文档文件和示例
一般建议使用默认路径,但如果数量使用像/ opt / PROJECT /这样的前缀,项目将安装在专用目录中,要从系统中删除,只需删除/ opt / PREFIX路径即可。但是此类安装将需要编辑所有环境变量以指向自定义路径。
3.4. 环境变量
环境中定义的几个变量会影响您的软件包安装。特别是,根据您的安装前缀,您可能需要更新其中一些变量,以确保系统工具可以找到已安装的组件。可以通过命令env
显示环境变量列表。
以下是受影响变量的列表:
- PATH: 定义变量简化路径,系统查找二进制文件的路径。例如,如果在/ usr / local /中安装软件包,则应更新PATH,使其包含/ usr / local / bin。这可以通过命令export PATH = / usr / local / bin:$ PATH来完成。
- LD_LIBRARY_PATH: 系统查找库的路径。例如,如果在/ usr / local /中安装软件包,则应更新LD_LIBRARY_PATH,使其包含/ usr / local / lib。这可以通过命令export LD_LIBRARY_PATH = / usr / local / lib:$ LD_LIBRARY_PATH来完成。有时不推荐使用此变量,而是使用ldconfig。
- CFLAGS: 包含C编译器使用的标志,通常包括预处理指令,如-IPREFIX / include或编译标志。自定义CFLAGS通常由源包构建系统作为源包编译器标志的前缀。或者,许多构建系统允许指定配置选项-extra-cflags。
- LDFLAGS: 这些是链接器使用的指令,通常包括链接指令,如查找自定义路径中安装的库所需的-LPREFIX / lib。自定义LDFLAGS通常由源包构建系统作为源包链接器标志的前缀。或者,许多构建系统允许指定configure选项-extra-ldflags。
- PKG_CONFIG_PATH: pkg-config使用的路径,用于检测许多编译系统使用的pkg-config文件,以检测特定库使用的自定义CFLAGS / LDFLAGS。
如果您在非标准路径中安装了软件包,则需要更新这些环境库,以便系统工具能够检测软件包组件。在为依赖于其他已安装的库/标头/工具的包运行配置脚本时,一定要这样做。
简要使用说明
- 常用库
库名 | 用途 |
---|---|
ffmpeg | 一个命令行工具,用来对视频文件转换格式,也支持对电视卡即时编码 |
ffserver | 一个HTTP多媒体即时广播流服务器,支持时光平移 |
ffplay | 一个简单的播放器,基于SDL与FFmpeg库 |
libavcodec | 包含全部FFmpeg音频/视频编解码库 |
libavformat | 包含demuxers和muxer库 |
libavutil | 包含一些工具库 |
libpostproc | 对于视频做前处理的库 |
libavutil | 包含一些工具库 |
libswscale | libswscale |
- 主要参数
参数名 | 意义 |
---|---|
-i | 设置输入档名。 |
-f | 设置输出格式。 |
-y | 若输出文件已存在时则覆盖文件。 |
-fs | 超过指定的文件大小时则结束转换。 |
-ss | 从指定时间开始转换。 |
-t | 从-ss时间开始转换(如-ss 00:00:01.00 -t 00:00:10.00即从00:00:01.00开始到00:00:11.00)。 |
-title | 设置标题。 |
-timestamp | 设置时间戳。 |
-vsync | 增减Frame使影音同步。 |
视频参数名 | 意义 |
---|---|
b:v | 设置视频流量,默认为200Kbit/秒。(单位请引用下方注意事项) |
r | 设置帧率值,默认为25。 |
s | 设置画面的宽与高。 |
aspect | 设置画面的比例。 |
vn | 不处理视频,于仅针对声音做处理时使用。 |
vcodec( -c:v ) | 设置视频视频编解码器,未设置时则使用与输入文件相同之编解码器。 |
声音参数名 | 意义 |
---|---|
b:a | 设置每Channel(最近的SVN版为所有Channel的总合)的流量。(单位请引用下方注意事项) |
ar | 设置采样率。 |
ac | 设置声音的Channel数。 |
acodec ( -c:a ) | 设置声音编解码器,未设置时与视频相同,使用与输入文件相同之编解码器。 |
an | 不处理声音,于仅针对视频做处理时使用。 |
vol | 设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推。) |
- ffprobe
一个编码后的文件是否正确就用以下命令,如果格式错误的话会输出一堆Error。
$ ffprobe -show_frames /xx.h265
$ ffprobe -print_format json -show_format -show_streams -i /xx.h265
- ffmpeg
查看文件基本信息
$ ffmpeg -i /xx.h265
- ffplay
ffplay逐帧播放视频与显示视频帧序号
目前使用这个功能检查部分画面不正确视频的原因。macOS下使用ffplay,按下s键可单帧播放视频,配合一个显示文字的视频滤镜即可显示当前画面的帧序号,命令示例如下所示。
$ ffplay -vf "drawtext=fontfile=/Library/Fonts/Arial.ttf:text=%{n}:box=1:x=(w-tw)/2:y=h-(2*lh)" xx.mp4