不同的机器上编译FFmpeg可能会有一定的差异,这里先贴一下我的机器配,如果你在编译过程中遇到一些问题,可能需要针对你的机器做一些调整或在网上搜索答案解决问题。
芯片:Apple M2
内存:16GB
磁盘:256GB
系统版本:13.5 macOS Ventura
下载源码
打开 FFmpeg下载界面 并选择其中的其中的某个版本点击下载,这样你就得到了FFmpeg源码的压缩包。
解压这个压缩包,就可以看到FFmpeg的几个模块以及开源协议等内容。
erlang
.
├── CONTRIBUTING.md
├── COPYING.GPLv2
├── COPYING.GPLv3
...
├── libavdevice
├── libavfilter
├── libavformat
├── libavutil
├── libpostproc
├── libswresample
├── libswscale
├── presets
├── tests
└── tools
配置 ./configure
在命令行中进入ffmpeg文件夹,执行./configure
,可以看到下面的输出,这些输出显示了我要将ffmepg安装在什么路径、使用的什么编译器以及支持了哪些编码器等等,内容太多,就不在这里一一列举了。
yaml
└─[$]> ./configure
install prefix /usr/local
source path .
C compiler gcc
C library
ARCH aarch64 (generic)
big-endian no
runtime cpu detection yes
NEON enabled yes
...
... 太多内容了省略
Enabled outdevs:
audiotoolbox sdl2
License: LGPL version 2.1 or later
WARNING: pkg-config not found, library detection may fail
最终还得到了一个警告WARNING: pkg-config not found, library detection may fail
,这个意思是FFmpeg的编译过程中将使用pkg-config
这个工具,它将用来检测FFmpeg编译过程中一些依赖库是否存在。但是在我的电脑中没有找到这个工具,管它三七二十一,直接brew install pkg-config
梭一把,看看效果,果然,还是很容易安装的嘛~
dart
┌─[sunlulu@sunluludeMac-mini] - [~/Downloads/ffmpeg-5.1.4] - [六 1 20, 22:03]
└─[$]> brew install pkg-config
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/api/formula.jws.json
##################################################################################################################################################################################################################################### 100.0%
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/api/cask.jws.json
##################################################################################################################################################################################################################################### 100.0%
==> Fetching pkg-config
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles/pkg-config-0.29.2_3.arm64_ventura.bottle.tar.gz
##################################################################################################################################################################################################################################### 100.0%
==> Pouring pkg-config-0.29.2_3.arm64_ventura.bottle.tar.gz
🍺 /opt/homebrew/Cellar/pkg-config/0.29.2_3: 11 files, 676KB
==> Running `brew cleanup pkg-config`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> `brew cleanup` has not been run in the last 30 days, running now...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
既然安装了pkg-config
这个工具,那么现在我们也就拥有了编译前置检测能力,这时候再运行一把./configure
,输出如下:
bash
┌─[sunlulu@sunluludeMac-mini] - [~/Downloads/ffmpeg-5.1.4] - [六 1 20, 22:10]
└─[$]> ./configure
install prefix /usr/local
source path .
C compiler gcc
C library
... 太多省略
libavformat/demuxer_list.c is unchanged
libavformat/muxer_list.c is unchanged
libavdevice/outdev_list.c is unchanged
libavformat/protocol_list.c is unchanged
这次输出已经没有警告信息了,并且最后显示xx.c is unchanged
,表明我们这次是增量配置,./configure
可以多次执行,没有任何问题。
当然,我们还可以在配置阶段指定编译哪些库,通过./configure --help
查询配置阶段支持哪些选项。
编译 make
在FFmpeg文件夹下,执行make
开始编译,整个编译过程很顺利,大概持续了一两分钟,中间时不时跳出一些warning,比如下面这些,不过我想这些应该没什么关系,我们继续下一步。
bash
libavcodec/videotoolboxenc.c:380:9: warning: variable 'status' set but not used [-Wunused-but-set-variable]
int status;
^
libavcodec/videotoolboxenc.c:1626:9: warning: variable 'sei_payload_type' set but not used [-Wunused-but-set-variable]
int sei_payload_type = 0;
^
2 warnings generated.
CC libavcodec/vima.o
CC libavcodec/vlc.o
CC libavcodec/vmdaudio.o
CC libavcodec/vmdvideo.o
CC libavcodec/vmnc.o
CC libavcodec/vorbis.o
CC libavcodec/vorbis_data.o
CC libavcodec/vorbis_parser.o
CC libavcodec/vorbisdec.o
libavcodec/vorbisdec.c:1904:8: warning: 'channel_layouts' is deprecated [-Wdeprecated-declarations]
.p.channel_layouts = ff_vorbis_channel_layouts,
^
libavcodec/codec.h:225:5: note: 'channel_layouts' has been explicitly marked deprecated here
attribute_deprecated
安装 make install
编译完成之后,是时候将产物和头文件安装到对应目录,在FFmpeg文件夹下执行make install
,很不幸,我这里得到一个Error,如下:
bash
└─[$]> make install
INSTALL doc/ffmpeg.1
INSTALL doc/ffplay.1
INSTALL doc/ffprobe.1
INSTALL doc/ffmpeg-all.1
INSTALL doc/ffplay-all.1
INSTALL doc/ffprobe-all.1
INSTALL doc/ffmpeg-utils.1
INSTALL doc/ffmpeg-scaler.1
INSTALL doc/ffmpeg-resampler.1
INSTALL doc/ffmpeg-codecs.1
INSTALL doc/ffmpeg-bitstream-filters.1
INSTALL doc/ffmpeg-formats.1
INSTALL doc/ffmpeg-protocols.1
INSTALL doc/ffmpeg-devices.1
INSTALL doc/ffmpeg-filters.1
INSTALL doc/libavutil.3
INSTALL doc/libswscale.3
INSTALL doc/libswresample.3
INSTALL doc/libavcodec.3
INSTALL doc/libavformat.3
INSTALL doc/libavdevice.3
INSTALL doc/libavfilter.3
install: /usr/local/share/man/man1/ffmpeg.1: Permission denied
make: *** [install-man] Error 71
显然,是因为我们之前在配置阶段的安装路径(默认的),当前用户执行时并没有权限(安装其实就是往这里文件夹里面拷贝一些文件)。
bash
install prefix /usr/local
修改命令为sudo make install
,用root权限执行,没有任何错误。
bash
┌─[sunlulu@sunluludeMac-mini] - [~/Downloads/ffmpeg-5.1.4] - [六 1 20, 22:27]
└─[$]> sudo make install
Password:
INSTALL doc/ffmpeg.1
INSTALL doc/ffplay.1
INSTALL doc/ffprobe.1
INSTALL doc/ffmpeg-all.1
INSTALL install-progs-yes
INSTALL ffmpeg
INSTALL ffplay
INSTALL ffprobe
...
INSTALL presets/libvpx-1080p.ffpreset
INSTALL presets/libvpx-1080p50_60.ffpreset
INSTALL presets/libvpx-360p.ffpreset
INSTALL presets/libvpx-720p.ffpreset
INSTALL doc/examples/filtering_audio.c
INSTALL doc/examples/filtering_video
...
INSTALL libavutil/video_enc_params.h
INSTALL libavutil/xtea.h
INSTALL libavutil/tea.h
INSTALL libavutil/tx.h
INSTALL libavutil/film_grain_params.h
INSTALL libavutil/avconfig.h
INSTALL libavutil/ffversion.h
INSTALL libavutil/libavutil.pc
可以看到make install
安装的内容主要包括:
- 文档类doc/** :FFmpeg的一些说明和一些示例代码
- 可执行程序:包括ffmpeg、ffprobe以及ffplay
- 头文件:写程序时include使用
- 其他的:.preset文件 .pc文件
由于我们安装的路径前缀是/usr/local
,进入这个目录看下
css
┌─[sunlulu@sunluludeMac-mini] - [/usr/local] - [六 1 20, 22:40]
└─[$]> cd /usr/local
┌─[sunlulu@sunluludeMac-mini] - [/usr/local] - [六 1 20, 22:40]
└─[$]> ls
bin corplink etc include lib share
┌─[sunlulu@sunluludeMac-mini] - [/usr/local] - [六 1 20, 22:40]
└─[$]> ls bin
2to3 corepack ffplay hexo mbox npx pydoc python-32 python2-config pythonw pythonw2.7 smtpd2.py
2to3-2 easy_install ffprobe idle mdev pip pydoc2 python-config python2.7 pythonw-32 pythonw2.7-32 vue
2to3-2.7 easy_install-2.7 gitx idle2 node pip2 pydoc2.7 python2 python2.7-32 pythonw2 smtpd.py
cnpm ffmpeg gitx-server idle2.7 npm pip2.7 python python2-32 python2.7-config pythonw2-32 smtpd2.7.py
┌─[sunlulu@sunluludeMac-mini] - [/usr/local] - [六 1 20, 22:40]
└─[$]> ls include
libavcodec libavdevice libavfilter libavformat libavutil libswresample libswscale node
最终,可执行程序被安装在了/usr/local/bin
目录,头文件被安装在了usr/local/include
目录。