从1开始打造的云转码-Ffmpeg的问题

题记

由上一篇中的一个需求(ffmpeg安装的问题),简单思考了下如何在不安装的情况下使用ffmpeg呢?

ffmpeg从哪来?

ffmpeg不多介绍,强大的功能是他能使用的如此广泛的原因之一。不过因为全部市面上可见的操作系统都不会内置,需要额外的安装操作,这对于懒一些的用户来说是不可接受的,那么怎么办?

1 脚本中增加【自动】安装的流程?

对于一个觉得shell是反人类的developer来说,这是不可接受的

2 下载预编译的ffmpeg

无论对developer还是对user来说,没有【编译流程】或者叫做【急速安装】的功能都是比较优化的(虽然有人说在自己的平台上定制会”性能更好“)。既然我们已经用全栈的python了,何不启动的时候通过python自动的配置好ffmpeg的环境呢?

方案落地

预编译的ffmpeg来源有如下几个

1
2
3
4
5
windows: https://ffmpeg.zeranoe.com/builds/win64/static/

linux:https://johnvansickle.com/ffmpeg/releases/

osx:https://evermeet.cx/ffmpeg/

GitlabCI + Gitlab Page 的妙用

gitlab是一家良心的git服务提供商(包括我的博客也落在上面),其提供了一套强大的CI服务,可以在提交的时候自动编译、发布一些产物。官方也提供了一个静态发布的博客 demo
借助其页面发布功能,我们可以自动更新ffmpeg的最新版本,发布到gitlab page上

这是我利用gitlabCI制作的全套ffmpeg二进制文件

FFmpeg

这是发布所需的ci规则,其中 download.sh 用于下载二进制文件并解压,makeindex.sh 用于制作一个简单(漏)的首页。

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
before_script:
- apt-get update -y
- apt-get install curl -y
- apt-get install p7zip-full -y
- chmod a+x download.sh
- chmod a+x makeindex.sh
- PATH=$PATH:.
- mkdir public
- mkdir public/win32-x64
- mkdir public/win32-ia32
- mkdir public/linux-x64
- mkdir public/linux-ia32
- mkdir public/linux-arm
- mkdir public/linux-arm64
- mkdir public/darwin-x64

pages:
stage: deploy
script:
- sh download.sh
- sh makeindex.sh public
artifacts:
paths:
- public
only:
- master

python自动下载的流程

利用request下载,然后配置到环境中就可以了,大概的流程如下:

1
2
3
4
5

def download_ffmpeg()
download_url = "http://ffmpeg.down.asia/{os_platform}-{arch}/{file}".format(os_platform=os_platform, arch=arch, file=target_file)
r = requests.get(download_url, stream=True)
...

download…

1
2
3
4
5
6
7
8
9

def setup():
ffprob_path = get_ffprobe_path()
target_ff_path = os.path.join(os.path.dirname(sys.executable), "ffmpeg")
target_fp_path = os.path.join(os.path.dirname(sys.executable), "ffprobe")
if not os.path.exists(target_ff_path):
os.symlink(ffmpeg_path, target_ff_path)
if not os.path.exists(target_fp_path):
os.symlink(ffprob_path, target_fp_path)

这样一来,我们只要在合适的时机执行下这个脚本就可以了~