Browse Source
Скрипт был случайно удалён в d773f172 вместе с .gitignore/.opencode.
Без него на Windows не собирается ffmpeg/ffmpeg_build/install -> HAVE_FFMPEG
не определяется -> воспроизведение и транскодирование видео отключены.
proxy
2 changed files with 270 additions and 0 deletions
@ -0,0 +1,269 @@ |
|||||||
|
#!/bin/bash |
||||||
|
set -euo pipefail |
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
||||||
|
BUILD_DIR="$SCRIPT_DIR/ffmpeg_build" |
||||||
|
SRC_DIR="$BUILD_DIR/src" |
||||||
|
INSTALL_DIR="$BUILD_DIR/install" |
||||||
|
JOBS=$(nproc 2>/dev/null || echo 4) |
||||||
|
|
||||||
|
case "$(uname -s)" in |
||||||
|
Linux) PLATFORM=linux ;; |
||||||
|
MINGW*|MSYS*|CYGWIN*) PLATFORM=windows ;; |
||||||
|
*) echo "Unsupported platform: $(uname -s)"; exit 1 ;; |
||||||
|
esac |
||||||
|
|
||||||
|
log() { echo "[FFmpeg] $1"; } |
||||||
|
die() { echo "[FFmpeg] ERROR: $1" >&2; exit 1; } |
||||||
|
check_cmd() { command -v "$1" >/dev/null 2>&1 || die "$1 not found. Install it first."; } |
||||||
|
|
||||||
|
do_clone() { |
||||||
|
local name="$1" url="$2" tag="$3" |
||||||
|
if [ ! -d "$SRC_DIR/$name" ]; then |
||||||
|
log "Clone $name..." |
||||||
|
for i in 1 2 3; do |
||||||
|
git clone --depth 1 --branch "$tag" "$url" "$SRC_DIR/$name" 2>&1 && break |
||||||
|
log "Clone attempt $i failed, retrying..." |
||||||
|
rm -rf "$SRC_DIR/$name" |
||||||
|
sleep 2 |
||||||
|
done |
||||||
|
[ -d "$SRC_DIR/$name/.git" ] || die "Failed to clone $name after 3 attempts" |
||||||
|
else |
||||||
|
log "Skip clone $name: already exists" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# ============================================================================ |
||||||
|
# Step 0: System dependencies |
||||||
|
# ============================================================================ |
||||||
|
if [ "$PLATFORM" = "linux" ]; then |
||||||
|
MISSING="" |
||||||
|
for pkg in build-essential cmake nasm pkg-config meson ninja-build git; do |
||||||
|
dpkg -s "$pkg" >/dev/null 2>&1 || MISSING="$MISSING $pkg" |
||||||
|
done |
||||||
|
if [ -n "$MISSING" ]; then |
||||||
|
log "Installing build tools:$MISSING" |
||||||
|
sudo apt update -qq && sudo apt install -y $MISSING |
||||||
|
fi |
||||||
|
HW_DEPS="libva-dev libvdpau-dev" |
||||||
|
for pkg in $HW_DEPS; do |
||||||
|
dpkg -s "$pkg" >/dev/null 2>&1 || { log "Installing $pkg (HW accel)"; sudo apt install -y $pkg; } |
||||||
|
done |
||||||
|
else |
||||||
|
check_cmd pacman |
||||||
|
for pkg in mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja mingw-w64-ucrt-x86_64-nasm \ |
||||||
|
mingw-w64-ucrt-x86_64-pkg-config mingw-w64-ucrt-x86_64-meson; do |
||||||
|
pacman -Qi "$pkg" >/dev/null 2>&1 || { log "Installing $pkg"; pacman -S --noconfirm "$pkg"; } |
||||||
|
done |
||||||
|
fi |
||||||
|
|
||||||
|
check_cmd cmake |
||||||
|
check_cmd nasm |
||||||
|
check_cmd pkg-config |
||||||
|
check_cmd meson |
||||||
|
check_cmd git |
||||||
|
|
||||||
|
# ============================================================================ |
||||||
|
# Step 1: Codec libraries (static .a, built with -fPIC) |
||||||
|
# ============================================================================ |
||||||
|
mkdir -p "$SRC_DIR" "$INSTALL_DIR/lib/pkgconfig" |
||||||
|
|
||||||
|
export PKG_CONFIG_PATH="$INSTALL_DIR/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" |
||||||
|
|
||||||
|
# --- x264 (H.264 encoder) --- |
||||||
|
if [ ! -f "$INSTALL_DIR/lib/pkgconfig/x264.pc" ]; then |
||||||
|
do_clone x264 https://code.videolan.org/videolan/x264.git stable |
||||||
|
cd "$SRC_DIR/x264" |
||||||
|
log "Configure x264..." |
||||||
|
./configure --prefix="$INSTALL_DIR" --enable-static --disable-shared \ |
||||||
|
--disable-opencl --disable-avs --disable-swscale --disable-lavf \ |
||||||
|
--disable-ffms --disable-gpac --disable-lsmash \ |
||||||
|
--extra-cflags="-fPIC" --disable-cli |
||||||
|
log "Build x264..." |
||||||
|
make -j"$JOBS" |
||||||
|
make install |
||||||
|
log "x264 OK" |
||||||
|
else |
||||||
|
log "Skip x264: already built" |
||||||
|
fi |
||||||
|
|
||||||
|
# --- x265 (H.265/HEVC encoder) --- |
||||||
|
if [ ! -f "$INSTALL_DIR/lib/pkgconfig/x265.pc" ]; then |
||||||
|
do_clone x265 https://bitbucket.org/multicoreware/x265_git.git master |
||||||
|
cd "$SRC_DIR/x265" |
||||||
|
mkdir -p build && cd build |
||||||
|
log "Configure x265..." |
||||||
|
cmake ../source -G "Unix Makefiles" \ |
||||||
|
-DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" \ |
||||||
|
-DBUILD_SHARED_LIBS=OFF \ |
||||||
|
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \ |
||||||
|
-DENABLE_CLI=OFF -DENABLE_SHARED=OFF \ |
||||||
|
-DHIGH_BIT_DEPTH=OFF -DENABLE_HDR10_PLUS=OFF |
||||||
|
log "Build x265..." |
||||||
|
cmake --build . -j"$JOBS" |
||||||
|
cmake --install . |
||||||
|
cat > "$INSTALL_DIR/lib/pkgconfig/x265.pc" <<EOF |
||||||
|
prefix=$INSTALL_DIR |
||||||
|
exec_prefix=\${prefix} |
||||||
|
libdir=\${exec_prefix}/lib |
||||||
|
includedir=\${prefix}/include |
||||||
|
|
||||||
|
Name: x265 |
||||||
|
Description: H.265/HEVC video encoder |
||||||
|
Version: 4.1 |
||||||
|
Libs: -L\${libdir} -lx265 |
||||||
|
Libs.private: -lstdc++ -lm -lpthread |
||||||
|
Cflags: -I\${includedir} |
||||||
|
EOF |
||||||
|
log "x265 OK" |
||||||
|
else |
||||||
|
log "Skip x265: already built" |
||||||
|
fi |
||||||
|
|
||||||
|
# --- libvpx (VP8/VP9 encoder) --- |
||||||
|
if [ ! -f "$INSTALL_DIR/lib/pkgconfig/vpx.pc" ]; then |
||||||
|
do_clone libvpx https://chromium.googlesource.com/webm/libvpx main |
||||||
|
cd "$SRC_DIR/libvpx" |
||||||
|
log "Configure libvpx..." |
||||||
|
./configure --prefix="$INSTALL_DIR" --enable-static --disable-shared \ |
||||||
|
--enable-pic --enable-vp8 --enable-vp9 --enable-vp9-highbitdepth \ |
||||||
|
--disable-examples --disable-tools --disable-docs --disable-unit-tests |
||||||
|
log "Build libvpx..." |
||||||
|
make -j"$JOBS" |
||||||
|
make install |
||||||
|
log "libvpx OK" |
||||||
|
else |
||||||
|
log "Skip libvpx: already built" |
||||||
|
fi |
||||||
|
|
||||||
|
# --- SVT-AV1 (fast AV1 encoder) --- |
||||||
|
if [ ! -f "$INSTALL_DIR/lib/pkgconfig/SvtAv1Enc.pc" ]; then |
||||||
|
do_clone SVT-AV1 https://gitlab.com/AOMediaCodec/SVT-AV1.git v2.3.0 |
||||||
|
cd "$SRC_DIR/SVT-AV1" |
||||||
|
mkdir -p build && cd build |
||||||
|
log "Configure SVT-AV1..." |
||||||
|
cmake .. -G "Unix Makefiles" \ |
||||||
|
-DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" \ |
||||||
|
-DBUILD_SHARED_LIBS=OFF -DBUILD_APPS=OFF \ |
||||||
|
-DBUILD_TESTING=OFF -DBUILD_DEC=OFF |
||||||
|
log "Build SVT-AV1..." |
||||||
|
cmake --build . -j"$JOBS" |
||||||
|
cmake --install . |
||||||
|
log "SVT-AV1 OK" |
||||||
|
else |
||||||
|
log "Skip SVT-AV1: already built" |
||||||
|
fi |
||||||
|
|
||||||
|
# --- libaom (reference AV1 encoder) --- |
||||||
|
if [ ! -f "$INSTALL_DIR/lib/pkgconfig/aom.pc" ]; then |
||||||
|
do_clone libaom https://aomedia.googlesource.com/aom v3.12.0 |
||||||
|
cd "$SRC_DIR/libaom" |
||||||
|
mkdir -p build && cd build |
||||||
|
log "Configure libaom..." |
||||||
|
cmake .. -G "Unix Makefiles" \ |
||||||
|
-DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" \ |
||||||
|
-DBUILD_SHARED_LIBS=OFF -DENABLE_TESTS=OFF \ |
||||||
|
-DENABLE_TOOLS=OFF -DENABLE_DOCS=OFF \ |
||||||
|
-DENABLE_NASM=ON |
||||||
|
log "Build libaom..." |
||||||
|
cmake --build . -j"$JOBS" |
||||||
|
cmake --install . |
||||||
|
log "libaom OK" |
||||||
|
else |
||||||
|
log "Skip libaom: already built" |
||||||
|
fi |
||||||
|
|
||||||
|
# --- dav1d (fast AV1 decoder) --- |
||||||
|
if [ ! -f "$INSTALL_DIR/lib/pkgconfig/dav1d.pc" ]; then |
||||||
|
do_clone dav1d https://code.videolan.org/videolan/dav1d.git 1.5.1 |
||||||
|
cd "$SRC_DIR/dav1d" |
||||||
|
log "Configure dav1d..." |
||||||
|
meson setup build --prefix="$INSTALL_DIR" --buildtype release --libdir lib \ |
||||||
|
-Ddefault_library=static -Denable_tools=false -Denable_tests=false -Denable_docs=false |
||||||
|
log "Build dav1d..." |
||||||
|
meson compile -C build -j"$JOBS" |
||||||
|
meson install -C build |
||||||
|
log "dav1d OK" |
||||||
|
else |
||||||
|
log "Skip dav1d: already built" |
||||||
|
fi |
||||||
|
|
||||||
|
# --- nv-codec-headers (NVIDIA NVENC/NVDEC headers, no build needed) --- |
||||||
|
if [ ! -f "$INSTALL_DIR/include/ffnvcodec/nvEncodeAPI.h" ]; then |
||||||
|
do_clone nv-codec-headers https://github.com/FFmpeg/nv-codec-headers.git master |
||||||
|
cd "$SRC_DIR/nv-codec-headers" |
||||||
|
log "Install nv-codec-headers..." |
||||||
|
make install PREFIX="$INSTALL_DIR" |
||||||
|
log "nv-codec-headers OK" |
||||||
|
else |
||||||
|
log "Skip nv-codec-headers: already installed" |
||||||
|
fi |
||||||
|
|
||||||
|
# ============================================================================ |
||||||
|
# Step 2: FFmpeg |
||||||
|
# ============================================================================ |
||||||
|
if [ -f "$INSTALL_DIR/lib/pkgconfig/libavcodec.pc" ]; then |
||||||
|
log "FFmpeg already built, skipping." |
||||||
|
log "Done: $INSTALL_DIR" |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
|
FFMPEG_SRC="$SRC_DIR/ffmpeg" |
||||||
|
if [ ! -d "$FFMPEG_SRC" ]; then |
||||||
|
log "Download FFmpeg 7.1.2..." |
||||||
|
FFMPEG_TARBALL="$SRC_DIR/ffmpeg-7.1.2.tar.xz" |
||||||
|
if [ ! -f "$FFMPEG_TARBALL" ]; then |
||||||
|
for url in \ |
||||||
|
"https://ffmpeg.org/releases/ffmpeg-7.1.2.tar.xz" \ |
||||||
|
"https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n7.1.2.tar.gz"; do |
||||||
|
curl -L --retry 3 -o "$FFMPEG_TARBALL" "$url" 2>&1 && break |
||||||
|
log "Download from $url failed, trying next..." |
||||||
|
rm -f "$FFMPEG_TARBALL" |
||||||
|
done |
||||||
|
[ -f "$FFMPEG_TARBALL" ] || die "Failed to download FFmpeg tarball" |
||||||
|
log "Download OK ($(du -h "$FFMPEG_TARBALL" | cut -f1))" |
||||||
|
fi |
||||||
|
log "Extract FFmpeg..." |
||||||
|
mkdir -p "$FFMPEG_SRC" |
||||||
|
tar -xf "$FFMPEG_TARBALL" -C "$FFMPEG_SRC" --strip-components=1 |
||||||
|
rm -f "$FFMPEG_TARBALL" |
||||||
|
fi |
||||||
|
|
||||||
|
cd "$SRC_DIR/ffmpeg" |
||||||
|
log "Configure FFmpeg..." |
||||||
|
|
||||||
|
CONFIGURE_ARGS=( |
||||||
|
--prefix="$INSTALL_DIR" |
||||||
|
--enable-shared --disable-static |
||||||
|
--enable-gpl --enable-version3 |
||||||
|
--pkg-config-flags=--static |
||||||
|
--extra-cflags="-I$INSTALL_DIR/include" |
||||||
|
--extra-ldflags="-L$INSTALL_DIR/lib" |
||||||
|
--extra-libs="-lpthread -lm -ldl" |
||||||
|
--enable-libx264 --enable-libx265 |
||||||
|
--enable-libvpx --enable-libsvtav1 --enable-libaom |
||||||
|
--enable-libdav1d |
||||||
|
--enable-nvenc --enable-cuda --enable-cuvid |
||||||
|
--enable-vaapi --enable-vdpau |
||||||
|
--disable-programs --disable-doc --disable-avdevice |
||||||
|
--disable-ffprobe --disable-ffplay --disable-ffmpeg |
||||||
|
--disable-debug --enable-optimizations |
||||||
|
) |
||||||
|
|
||||||
|
if [ "$PLATFORM" = "windows" ]; then |
||||||
|
CONFIGURE_ARGS+=( |
||||||
|
--enable-d3d11va --enable-dxva2 |
||||||
|
) |
||||||
|
fi |
||||||
|
|
||||||
|
"./configure" "${CONFIGURE_ARGS[@]}" |
||||||
|
|
||||||
|
log "Build FFmpeg..." |
||||||
|
make -j"$JOBS" |
||||||
|
make install |
||||||
|
|
||||||
|
log "===============================================================" |
||||||
|
log "FFmpeg build SUCCESS" |
||||||
|
log "Install prefix: $INSTALL_DIR" |
||||||
|
log "Libraries: $(ls "$INSTALL_DIR/lib/"*.so* "$INSTALL_DIR/lib/"*.dll.a "$INSTALL_DIR/bin/"*.dll 2>/dev/null | tr '\n' ' ')" |
||||||
|
log "===============================================================" |
||||||
Loading…
Reference in new issue