因为项目需要,需要在EC2和EB中安装FFMPEG来处理视频。

但Amazon Linux默认的yum源中没有FFMPEG,因此需要手动进行安装。

网上有各种的安装方法,有使用Nux Dextop YUM的安装,也有直接使用Static Builds的方式。经过比较试验,最终决定使用Static Builds的方式进行安装,安装方法记录如下。

在Amazon Linux中安装FFMPEG

FFMPEG官网 https://www.ffmpeg.org/download.html 中,推荐的Linux Static Builds的下载地址为: https://johnvansickle.com/ffmpeg/

64位的Release版的下载地址为: https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz, 注意网上很多教程和gist中所提的这个下载地址 http://ffmpeg.gusari.org/static/64bit/ffmpeg.static.64bit.latest.tar.gz 已经不再维护了。

登陆Amazon Linux,下载压缩包,解压后直接拷贝到指定的bin目录即可使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 下载
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz
# 解压
tar xJfv ffmpeg-release-64bit-static.tar.xz
# 拷贝到指定bin目录(此处以latest版本是4.1,目标bin目录为/usr/local/bin/为例)
cd ffmpeg-4.1-64bit-static/
sudo cp ffmpeg ffprobe /usr/local/bin/
# 测试命令是否可用
ffmpeg
ffprobe

实际操作中有需要的话,可以再将ffmpegffprobe链到/usr/bin中。

在Elastic BeanStalk中安装FFMPEG

在没有科学上网的情况下,国内访问https://johnvansickle.com这个网站很不稳定,在Beijing Region的EC2中,下载速度有时只有几KB。
为了能够在Elastic BeanStalk中稳定安装FFMPEG,采取的方案是自己将二进制文件重新打包,先上传到国内的S3中,再从S3下载二进制文件安装到EB的Instance中。
除了稳定外,这样还有一个好处,就是使用的Release的版本自己可控。即使johnvansickle.com后续不再维护FFMPEG了或者有最新的Release了,也不会对我们的使用产生影响。

具体步骤如下:

在本地机器或某个EC2中打包二进制文件上传S3, 此处以最新版的4.1为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz
# 解压
tar xJfv ffmpeg-release-64bit-static.tar.xz
# 制作压缩包
mkdir ffmpeg-4.1-64bit
cp ffmpeg-4.1-64bit-static/ffmpeg ffmpeg-4.1-64bit-static/ffprobe ffmpeg-4.1-64bit
cd ffmpeg-4.1-64bit
tar czvf ffmpeg-4.1-64bit.tar.gz ffmpeg ffprobe
# 上传压缩包到S3 (此处bucket和路径需要换成实际使用的)
aws s3 cp ffmpeg-4.1-64bit.tar.gz s3://test-for-ffmpeg-bucket/ffmpeg/ --acl public-read

配置EB从S3下载压缩包并解压到指定bin目录,此处可以直接使用EB的sources语法, 比自己用shell写一堆的命令来的更简洁。sources语法目前支持 tar, tar+gzip, tar+bz2, 和zip这四种格式。

在.ebextensions目录下添加配置文件20-install-ffmpeg.config, 内容如下。/usr/local/bin可以修改为实际需要安装的路径。

1
2
sources:
/usr/local/bin: https://s3.cn-north-1.amazonaws.com.cn/test-for-ffmpeg-bucket/ffmpeg/ffmpeg-4.1-64bit.tar.gz

使用eb deploy发布,发布后登陆EC2查看是否生效。

yum源方式安装失败

网上也有文章提及了可以添加Nux Dextop YUM源的方式来进行安装, 这种方式可能适用于CentOS,但测试下来,并不适用于Amazon Linux,安装时会报错。
应该还需要安装其他的lib源才可以顺利安装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
错误:软件包:libavdevice-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libSDL-1.2.so.0()(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libgnutls.so.28(GNUTLS_3_0_0)(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libtheoraenc.so.1()(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libass.so.5()(64bit)
错误:软件包:libavdevice-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libv4l2.so.0()(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libva.so.1()(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libgsm.so.1()(64bit)
错误:软件包:libavdevice-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libcdio_cdda.so.1()(64bit)
错误:软件包:libavdevice-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libopenal.so.1()(64bit)
错误:软件包:ffmpeg-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libSDL-1.2.so.0()(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libtheoradec.so.1(libtheoradec_1.0)(64bit)
错误:软件包:libavdevice-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libcdio_paranoia.so.1()(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libgnutls.so.28(GNUTLS_1_4)(64bit)
错误:软件包:libavdevice-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libpulse.so.0()(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libschroedinger-1.0.so.0()(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libopenjpeg.so.1()(64bit)
错误:软件包:libavdevice-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libcdio_cdda.so.1(CDIO_CDDA_1)(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libtheoraenc.so.1(libtheoraenc_1.0)(64bit)
错误:软件包:libdc1394-2.2.0-4.el7.nux.x86_64 (nux-dextop)
需要:libraw1394.so.11()(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libgnutls.so.28()(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libtheoradec.so.1()(64bit)
错误:软件包:libavdevice-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libpulse.so.0(PULSE_0)(64bit)
错误:软件包:ffmpeg-libs-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libopus.so.0()(64bit)
错误:软件包:libavdevice-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libcdio_paranoia.so.1(CDIO_PARANOIA_1)(64bit)
错误:软件包:ffmpeg-2.8.15-1.el7.nux.x86_64 (nux-dextop)
需要:libvdpau.so.1()(64bit)
您可以尝试添加 --skip-broken 选项来解决该问题
您可以尝试执行:rpm -Va --nofiles --nodigest

Reference

留言