#!/usr/bin/env bash # 将 ffmpeg 升级到含 -stats_period(约 4.4+),供 douyin_youtube_ffplay / robust_relay 使用。 # Debian 11 默认 4.3.x:先试强制从 bullseye-backports 安装;仍不行则用 arm64 静态包到 /usr/local/bin。 set -euo pipefail if [[ ${EUID:-0} -ne 0 ]]; then exec sudo bash "$0" "$@" fi have_stats_period() { command -v ffmpeg >/dev/null 2>&1 || return 1 # ffmpeg 把 -h full 打到 stderr,不能 2>/dev/null 否则永远匹配不到 ffmpeg -hide_banner -h full 2>&1 | grep -qE 'stats_period' } install_johnvansickle_arm64_static() { local url="https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-arm64-static.tar.xz" local td dir td=$(mktemp -d) trap 'rm -rf "$td"' EXIT echo "[INFO] 下载 arm64 静态 ffmpeg(johnvansickle)…" if command -v curl >/dev/null 2>&1; then curl -fsSL -o "$td/ff.tar.xz" "$url" elif command -v wget >/dev/null 2>&1; then wget -q -O "$td/ff.tar.xz" "$url" else echo "需要 curl 或 wget" >&2 return 1 fi tar -xJf "$td/ff.tar.xz" -C "$td" dir=$(find "$td" -maxdepth 1 -type d -name 'ffmpeg-*-arm64-static' | head -1) if [[ ! -d "$dir" ]]; then echo "解压后未找到 ffmpeg-*-arm64-static" >&2 return 1 fi install -m 0755 "$dir/ffmpeg" /usr/local/bin/ffmpeg install -m 0755 "$dir/ffprobe" /usr/local/bin/ffprobe hash -r trap - EXIT rm -rf "$td" echo "[INFO] 已写入 /usr/local/bin/ffmpeg(PATH 中优先于 /usr/bin 时生效)" } if have_stats_period; then echo "[OK] 当前 ffmpeg 已支持 -stats_period" command -v ffmpeg ffmpeg -version | head -1 exit 0 fi if [[ ! -r /etc/os-release ]]; then echo "无法读取 /etc/os-release" >&2 if [[ "$(uname -m)" == aarch64 ]]; then install_johnvansickle_arm64_static || exit 1 have_stats_period && exit 0 fi exit 1 fi # shellcheck source=/dev/null . /etc/os-release case "${ID:-}" in debian) case "${VERSION_CODENAME:-}" in bullseye) BP=/etc/apt/sources.list.d/bullseye-backports.list if ! grep -qE 'bullseye-backports' /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null; then echo "deb http://deb.debian.org/debian bullseye-backports main" >"$BP" fi apt-get update -qq echo "[INFO] ffmpeg 可用版本(apt-cache madison,前几行):" apt-cache madison ffmpeg 2>/dev/null | head -12 || true # 显式指定发行版,避免仍选中 bullseye 主源的 4.3.9 apt-get install -y ffmpeg/bullseye-backports || true ;; bookworm|trixie|sid) apt-get update -qq apt-get install -y ffmpeg ;; *) echo "未内置规则的 Debian 代号: ${VERSION_CODENAME}" >&2 ;; esac ;; ubuntu) apt-get update -qq apt-get install -y ffmpeg ;; *) echo "发行版 ${ID:-unknown}:跳过 apt 规则" >&2 ;; esac if have_stats_period; then echo "[OK] apt 升级后已支持 -stats_period" command -v ffmpeg ffmpeg -version | head -1 exit 0 fi if [[ "$(uname -m)" == aarch64 ]]; then echo "[WARN] apt 仍未提供带 -stats_period 的 ffmpeg,改用静态包" >&2 install_johnvansickle_arm64_static fi ffmpeg -version | head -1 || true if have_stats_period; then echo "[OK] 当前 ffmpeg 已支持 -stats_period" command -v ffmpeg exit 0 fi echo "[FATAL] 仍无法使用 -stats_period,请检查网络或手动安装 ffmpeg 4.4+(aarch64)" >&2 exit 1