devops: build ffmpeg for linux (#3880)

This commit is contained in:
Andrey Lushnikov 2020-09-14 15:12:35 -07:00 committed by GitHub
parent 1eb282d139
commit 2a66f8a066
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 122 additions and 10 deletions

View file

@ -70,3 +70,6 @@ git pull origin master
git pull origin master git pull origin master
../checkout_build_archive_upload.sh ffmpeg-cross-compile-win64 >/tmp/$(basename $0)--ffmpeg-cross-compile-win64.log || true ../checkout_build_archive_upload.sh ffmpeg-cross-compile-win64 >/tmp/$(basename $0)--ffmpeg-cross-compile-win64.log || true
git pull origin master
../checkout_build_archive_upload.sh ffmpeg-linux >/tmp/$(basename $0)--ffmpeg-linux.log || true

View file

@ -42,6 +42,12 @@ if [[ "$BUILD_FLAVOR" == "ffmpeg-mac" ]]; then
EXPECTED_HOST_OS="Darwin" EXPECTED_HOST_OS="Darwin"
EXPECTED_HOST_OS_VERSION="10.14" EXPECTED_HOST_OS_VERSION="10.14"
BUILD_BLOB_NAME="ffmpeg-mac.zip" BUILD_BLOB_NAME="ffmpeg-mac.zip"
elif [[ "$BUILD_FLAVOR" == "ffmpeg-linux" ]]; then
BROWSER_NAME="ffmpeg"
EXTRA_BUILD_ARGS="--linux"
EXPECTED_HOST_OS="Ubuntu"
EXPECTED_HOST_OS_VERSION="20.04"
BUILD_BLOB_NAME="ffmpeg-linux.zip"
elif [[ "$BUILD_FLAVOR" == "ffmpeg-cross-compile-win32" ]]; then elif [[ "$BUILD_FLAVOR" == "ffmpeg-cross-compile-win32" ]]; then
BROWSER_NAME="ffmpeg" BROWSER_NAME="ffmpeg"
EXTRA_BUILD_ARGS="--cross-compile-win32" EXTRA_BUILD_ARGS="--cross-compile-win32"

View file

@ -1,16 +1,30 @@
# Playwright and FFMPEG # Playwright and FFMPEG
Playwright requires FFMPEG to produce screncast. Playwright relies on stock Playwright requires FFMPEG to produce screncast and bundles FFMPEG binaries for Mac , Linux and Windows.
FFMPEG on Ubuntu, and bundles FFMPEG binaries for Mac and Windows.
## Configuration ## Configuration
We compile `libvpx` and `ffmpeg` only. Their source versions and build We compile `libvpx` and `ffmpeg` only. Their source versions and build
configurations are defined in [`//browser_patches/ffmpeg/CONFIG.sh`](./CONFIG.sh). configurations are defined in [`//browser_patches/ffmpeg/CONFIG.sh`](./CONFIG.sh).
## Building `ffmpeg-linux`
Compilation scripts are based on:
- https://trac.ffmpeg.org/wiki/CompilationGuide/Generic
Prerequisites:
- Mac or Linux
- Docker
Building:
```
~/playwright$ ./browser_patches/ffmpeg/build.sh --linux
```
## Building `ffmpeg-mac` ## Building `ffmpeg-mac`
Cross-compilation scripts are based on: Compilation scripts are based on:
- https://trac.ffmpeg.org/wiki/CompilationGuide/Generic - https://trac.ffmpeg.org/wiki/CompilationGuide/Generic
- https://trac.ffmpeg.org/wiki/CompilationGuide/macOS - https://trac.ffmpeg.org/wiki/CompilationGuide/macOS

View file

@ -0,0 +1,82 @@
#!/bin/bash
# Copyright (c) Microsoft Corporation.
#
# Licensed under the Apache License, Version 2.0 (the 'License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -ex
function die() { echo "$@"; exit 1; }
PREFIX="${HOME}/prefix"
if [[ "$(uname)" != "Linux" ]]; then
echo "ERROR: this script is designed to be run on Linux. Can't run on $(uname)"
exit 1
fi
output_path="$1"
if [[ -z "${output_path}" ]]; then
die "ERROR: output path is not specified"
elif [[ "${output_path}" != /* ]]; then
die "ERROR: output path ${output_path} is not absolute"
elif ! [[ -d $(dirname "${output_path}") ]]; then
die "ERROR: folder for output path ${output_path} does not exist."
fi
function build_libvpx {
cd "${HOME}"
git clone https://chromium.googlesource.com/webm/libvpx
cd libvpx
git checkout "${LIBVPX_VERSION}"
# Cross-compiling libvpx according to the docs:
# - https://chromium.googlesource.com/webm/libvpx/+/master/README
./configure --prefix="${PREFIX}" ${LIBVPX_CONFIG}
make && make install
}
function build_ffmpeg {
cd "${HOME}"
git clone git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg
git checkout "${FFMPEG_VERSION}"
# Prohibit pkg-config from using linux system installed libs.
export PKG_CONFIG_LIBDIR=
./configure --pkg-config=pkg-config \
--pkg-config-flags="--static" \
--extra-cflags="-I/${PREFIX}/include" \
--extra-ldflags="-L/${PREFIX}/lib -static" \
--prefix="${PREFIX}" \
--bindir="${PWD}/bin" \
${FFMPEG_CONFIG}
make && make install
}
trap "cd $(pwd -P)" EXIT
cd "$(dirname $0)"
source ./CONFIG.sh
apt-get update
apt-get install -y git make yasm pkg-config
build_libvpx
build_ffmpeg
# put resulting executable where we were asked to
cp "${HOME}/ffmpeg/bin/ffmpeg" "${output_path}"
strip "${output_path}"

View file

@ -36,20 +36,27 @@ fi
rm -rf ./output rm -rf ./output
mkdir -p output mkdir -p output
dockerflags="";
# Use |-it| to run docker to support Ctrl-C if we run the script inside interactive terminal.
# Otherwise (e.g. cronjob) - do nothing.
if [[ -t 0 ]]; then
dockerflags="-it"
fi
if [[ "$1" == "--mac" ]]; then if [[ "$1" == "--mac" ]]; then
bash ./build-mac.sh bash ./build-mac.sh
cd output && zip ffmpeg.zip ffmpeg-mac cd output && zip ffmpeg.zip ffmpeg-mac
elif [[ "$1" == --cross-compile-win* ]]; then elif [[ "$1" == "--linux" ]]; then
if ! command -v docker >/dev/null; then if ! command -v docker >/dev/null; then
echo "ERROR: docker is required for the script" echo "ERROR: docker is required for the script"
exit 1 exit 1
fi fi
time docker run --init --rm -v"${PWD}":/host ${dockerflags} ubuntu:18.04 bash /host/build-linux.sh /host/output/ffmpeg-linux
dockerflags=""; cd output && zip ffmpeg.zip ffmpeg-linux
# Use |-it| to run docker to support Ctrl-C if we run the script inside interactive terminal. elif [[ "$1" == --cross-compile-win* ]]; then
# Otherwise (e.g. cronjob) - do nothing. if ! command -v docker >/dev/null; then
if [[ -t 0 ]]; then echo "ERROR: docker is required for the script"
dockerflags="-it" exit 1
fi fi
if [[ "$1" == "--cross-compile-win32" ]]; then if [[ "$1" == "--cross-compile-win32" ]]; then