|
@@ -0,0 +1,337 @@
|
|
|
|
|
+#!/bin/bash
|
|
|
|
|
+# ============================================
|
|
|
|
|
+# FFmpeg WHIP 支持编译脚本
|
|
|
|
|
+# 智能检测:已安装则跳过,未安装则编译
|
|
|
|
|
+# ============================================
|
|
|
|
|
+
|
|
|
|
|
+set -e
|
|
|
|
|
+
|
|
|
|
|
+# 配置
|
|
|
|
|
+BUILD_DIR="$HOME/ffmpeg-whip-build"
|
|
|
|
|
+INSTALL_PREFIX="/usr/local/ffmpeg-whip"
|
|
|
|
|
+NPROC=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
|
|
|
|
|
+
|
|
|
|
|
+echo ""
|
|
|
|
|
+echo "╔══════════════════════════════════════════════════════════════╗"
|
|
|
|
|
+echo "║ FFmpeg WHIP 支持编译脚本 (智能检测版) ║"
|
|
|
|
|
+echo "║ 编译目录: $BUILD_DIR"
|
|
|
|
|
+echo "║ 安装目录: $INSTALL_PREFIX"
|
|
|
|
|
+echo "║ CPU 核心: $NPROC"
|
|
|
|
|
+echo "╚══════════════════════════════════════════════════════════════╝"
|
|
|
|
|
+echo ""
|
|
|
|
|
+
|
|
|
|
|
+# ==================== 检查是否已安装 ====================
|
|
|
|
|
+echo "┌──────────────────────────────────────────────────────────────┐"
|
|
|
|
|
+echo "│ 预检查: FFmpeg WHIP 支持 │"
|
|
|
|
|
+echo "└──────────────────────────────────────────────────────────────┘"
|
|
|
|
|
+
|
|
|
|
|
+if [ -x "$INSTALL_PREFIX/bin/ffmpeg" ]; then
|
|
|
|
|
+ WHIP_CHECK=$("$INSTALL_PREFIX/bin/ffmpeg" -formats 2>/dev/null | grep -c "whip" || echo 0)
|
|
|
|
|
+ if [ "$WHIP_CHECK" -gt 0 ]; then
|
|
|
|
|
+ echo "✅ FFmpeg WHIP 已安装,无需重新编译"
|
|
|
|
|
+ "$INSTALL_PREFIX/bin/ffmpeg" -version | head -1
|
|
|
|
|
+ echo ""
|
|
|
|
|
+ echo "如需强制重新编译,请删除后再运行:"
|
|
|
|
|
+ echo " sudo rm -rf $INSTALL_PREFIX"
|
|
|
|
|
+ echo " ./scripts/build-ffmpeg-whip.sh"
|
|
|
|
|
+ exit 0
|
|
|
|
|
+ fi
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+echo "未检测到支持 WHIP 的 FFmpeg,开始编译..."
|
|
|
|
|
+echo ""
|
|
|
|
|
+
|
|
|
|
|
+# 创建目录
|
|
|
|
|
+mkdir -p "$BUILD_DIR"
|
|
|
|
|
+cd "$BUILD_DIR"
|
|
|
|
|
+
|
|
|
|
|
+# ==================== 步骤 1: 安装依赖 ====================
|
|
|
|
|
+echo "┌──────────────────────────────────────────────────────────────┐"
|
|
|
|
|
+echo "│ 步骤 1/3: 检查并安装依赖 │"
|
|
|
|
|
+echo "└──────────────────────────────────────────────────────────────┘"
|
|
|
|
|
+
|
|
|
|
|
+install_deps_centos() {
|
|
|
|
|
+ echo "检测到 CentOS/RHEL,检查依赖..."
|
|
|
|
|
+
|
|
|
|
|
+ # 检查 Development Tools
|
|
|
|
|
+ if ! rpm -q gcc &>/dev/null; then
|
|
|
|
|
+ echo "安装 Development Tools..."
|
|
|
|
|
+ sudo yum groupinstall -y "Development Tools"
|
|
|
|
|
+ else
|
|
|
|
|
+ echo "✓ Development Tools 已安装"
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ # 尝试安装 EPEL (需要先安装,因为 x264 在 EPEL 里)
|
|
|
|
|
+ if ! rpm -q epel-release &>/dev/null; then
|
|
|
|
|
+ echo "安装 EPEL..."
|
|
|
|
|
+ sudo yum install -y epel-release || true
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ # 检查其他依赖
|
|
|
|
|
+ DEPS="cmake git openssl-devel nasm x264-devel opus-devel"
|
|
|
|
|
+ for dep in $DEPS; do
|
|
|
|
|
+ if ! rpm -q $dep &>/dev/null; then
|
|
|
|
|
+ echo "安装 $dep..."
|
|
|
|
|
+ sudo yum install -y $dep || true
|
|
|
|
|
+ else
|
|
|
|
|
+ echo "✓ $dep 已安装"
|
|
|
|
|
+ fi
|
|
|
|
|
+ done
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+install_deps_ubuntu() {
|
|
|
|
|
+ echo "检测到 Debian/Ubuntu,检查依赖..."
|
|
|
|
|
+
|
|
|
|
|
+ DEPS="build-essential cmake git pkg-config libssl-dev nasm libx264-dev libopus-dev"
|
|
|
|
|
+ MISSING=""
|
|
|
|
|
+
|
|
|
|
|
+ for dep in $DEPS; do
|
|
|
|
|
+ if ! dpkg -s $dep &>/dev/null; then
|
|
|
|
|
+ MISSING="$MISSING $dep"
|
|
|
|
|
+ else
|
|
|
|
|
+ echo "✓ $dep 已安装"
|
|
|
|
|
+ fi
|
|
|
|
|
+ done
|
|
|
|
|
+
|
|
|
|
|
+ if [ -n "$MISSING" ]; then
|
|
|
|
|
+ echo "安装缺失依赖:$MISSING"
|
|
|
|
|
+ sudo apt-get update
|
|
|
|
|
+ sudo apt-get install -y $MISSING
|
|
|
|
|
+ fi
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+install_deps_macos() {
|
|
|
|
|
+ echo "检测到 macOS,检查依赖..."
|
|
|
|
|
+
|
|
|
|
|
+ DEPS="cmake openssl nasm pkg-config x264 opus"
|
|
|
|
|
+ for dep in $DEPS; do
|
|
|
|
|
+ if ! brew list $dep &>/dev/null; then
|
|
|
|
|
+ echo "安装 $dep..."
|
|
|
|
|
+ brew install $dep || true
|
|
|
|
|
+ else
|
|
|
|
|
+ echo "✓ $dep 已安装"
|
|
|
|
|
+ fi
|
|
|
|
|
+ done
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 根据系统选择安装方式
|
|
|
|
|
+if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
|
|
|
+ install_deps_macos
|
|
|
|
|
+elif command -v yum &>/dev/null; then
|
|
|
|
|
+ install_deps_centos
|
|
|
|
|
+elif command -v apt-get &>/dev/null; then
|
|
|
|
|
+ install_deps_ubuntu
|
|
|
|
|
+elif command -v dnf &>/dev/null; then
|
|
|
|
|
+ echo "检测到 Fedora/RHEL 8+,使用 dnf..."
|
|
|
|
|
+ sudo dnf groupinstall -y "Development Tools"
|
|
|
|
|
+ sudo dnf install -y epel-release || true
|
|
|
|
|
+ sudo dnf install -y cmake git openssl-devel nasm x264-devel opus-devel
|
|
|
|
|
+else
|
|
|
|
|
+ echo "⚠️ 未知系统,请手动安装: cmake git openssl-devel nasm"
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+echo "✅ 依赖检查完成"
|
|
|
|
|
+echo ""
|
|
|
|
|
+
|
|
|
|
|
+# ==================== 步骤 2: 编译 FFmpeg ====================
|
|
|
|
|
+echo "┌──────────────────────────────────────────────────────────────┐"
|
|
|
|
|
+echo "│ 步骤 2/3: 编译 FFmpeg (支持 WHIP) │"
|
|
|
|
|
+echo "└──────────────────────────────────────────────────────────────┘"
|
|
|
|
|
+
|
|
|
|
|
+cd "$BUILD_DIR"
|
|
|
|
|
+
|
|
|
|
|
+if [ ! -d "ffmpeg-git" ]; then
|
|
|
|
|
+ echo "下载 FFmpeg 源码..."
|
|
|
|
|
+ git clone --depth 1 https://git.ffmpeg.org/ffmpeg.git ffmpeg-git
|
|
|
|
|
+else
|
|
|
|
|
+ echo "FFmpeg 源码已存在,重置到最新版本..."
|
|
|
|
|
+ cd ffmpeg-git
|
|
|
|
|
+ git fetch origin
|
|
|
|
|
+ git reset --hard origin/master
|
|
|
|
|
+ cd ..
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+cd ffmpeg-git
|
|
|
|
|
+
|
|
|
|
|
+# ==================== 应用 WHIP Bug 修复 ====================
|
|
|
|
|
+echo ""
|
|
|
|
|
+echo "应用 WHIP muxer 补丁..."
|
|
|
|
|
+
|
|
|
|
|
+WHIP_FILE="libavformat/whip.c"
|
|
|
|
|
+if [ -f "$WHIP_FILE" ]; then
|
|
|
|
|
+ # 跨平台 sed 函数 (兼容 macOS 和 Linux)
|
|
|
|
|
+ sed_inplace() {
|
|
|
|
|
+ if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
|
|
|
+ sed -i '' "$@"
|
|
|
|
|
+ else
|
|
|
|
|
+ sed -i "$@"
|
|
|
|
|
+ fi
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ # Bug Fix #1: rtcp-fb 缺少冒号
|
|
|
|
|
+ if grep -q '"a=rtcp-fb%u' "$WHIP_FILE"; then
|
|
|
|
|
+ echo " 修复 Bug #1: rtcp-fb 缺少冒号..."
|
|
|
|
|
+ sed_inplace 's/"a=rtcp-fb%u/"a=rtcp-fb:%u/g' "$WHIP_FILE"
|
|
|
|
|
+ echo " ✓ Bug #1 已修复"
|
|
|
|
|
+ else
|
|
|
|
|
+ echo " ✓ Bug #1 已经修复或不存在"
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ # Bug Fix #2: BUNDLE 和 mid 硬编码问题 (针对 video-only 模式)
|
|
|
|
|
+ if grep -q 'BUNDLE 0 1' "$WHIP_FILE"; then
|
|
|
|
|
+ echo " 修复 Bug #2: BUNDLE/mid 硬编码问题..."
|
|
|
|
|
+ cp "$WHIP_FILE" "${WHIP_FILE}.orig"
|
|
|
|
|
+ sed_inplace 's/BUNDLE 0 1/BUNDLE 0/g' "$WHIP_FILE"
|
|
|
|
|
+ sed_inplace 's/"a=mid:1\\r\\n"/"a=mid:0\\r\\n"/g' "$WHIP_FILE"
|
|
|
|
|
+ if ! grep -q 'BUNDLE 0 1' "$WHIP_FILE"; then
|
|
|
|
|
+ echo " ✓ Bug #2 已修复 (BUNDLE 改为 0, 支持 video-only 模式)"
|
|
|
|
|
+ else
|
|
|
|
|
+ echo " ⚠ BUNDLE 修复可能未完全生效"
|
|
|
|
|
+ fi
|
|
|
|
|
+ else
|
|
|
|
|
+ echo " ✓ Bug #2 已经修复或不存在"
|
|
|
|
|
+ fi
|
|
|
|
|
+ echo "✅ WHIP 补丁应用完成"
|
|
|
|
|
+else
|
|
|
|
|
+ echo "⚠️ 未找到 WHIP 源文件,跳过补丁"
|
|
|
|
|
+fi
|
|
|
|
|
+echo ""
|
|
|
|
|
+
|
|
|
|
|
+echo "配置 FFmpeg..."
|
|
|
|
|
+
|
|
|
|
|
+# 清理之前的编译
|
|
|
|
|
+make distclean 2>/dev/null || true
|
|
|
|
|
+
|
|
|
|
|
+# 设置编译参数
|
|
|
|
|
+EXTRA_CFLAGS=""
|
|
|
|
|
+EXTRA_LDFLAGS=""
|
|
|
|
|
+
|
|
|
|
|
+# macOS 特殊处理: OpenSSL, x264, opus 路径
|
|
|
|
|
+if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
|
|
|
+ OPENSSL_PREFIX=$(brew --prefix openssl)
|
|
|
|
|
+ X264_PREFIX=$(brew --prefix x264)
|
|
|
|
|
+ OPUS_PREFIX=$(brew --prefix opus)
|
|
|
|
|
+ export PKG_CONFIG_PATH="$OPENSSL_PREFIX/lib/pkgconfig:$X264_PREFIX/lib/pkgconfig:$OPUS_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH"
|
|
|
|
|
+ EXTRA_CFLAGS="-I$OPENSSL_PREFIX/include -I$X264_PREFIX/include -I$OPUS_PREFIX/include"
|
|
|
|
|
+ EXTRA_LDFLAGS="-L$OPENSSL_PREFIX/lib -L$X264_PREFIX/lib -L$OPUS_PREFIX/lib"
|
|
|
|
|
+ echo "macOS 库路径:"
|
|
|
|
|
+ echo " OpenSSL: $OPENSSL_PREFIX"
|
|
|
|
|
+ echo " x264: $X264_PREFIX"
|
|
|
|
|
+ echo " opus: $OPUS_PREFIX"
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+echo "PKG_CONFIG_PATH: $PKG_CONFIG_PATH"
|
|
|
|
|
+echo ""
|
|
|
|
|
+
|
|
|
|
|
+# 配置 FFmpeg
|
|
|
|
|
+# WHIP muxer 依赖: dtls_protocol -> openssl
|
|
|
|
|
+# 视频编码: libx264 (支持 -preset)
|
|
|
|
|
+# 音频编码: libopus
|
|
|
|
|
+./configure \
|
|
|
|
|
+ --prefix="$INSTALL_PREFIX" \
|
|
|
|
|
+ --enable-gpl \
|
|
|
|
|
+ --enable-nonfree \
|
|
|
|
|
+ --enable-openssl \
|
|
|
|
|
+ --enable-libx264 \
|
|
|
|
|
+ --enable-libopus \
|
|
|
|
|
+ --extra-cflags="$EXTRA_CFLAGS" \
|
|
|
|
|
+ --extra-ldflags="$EXTRA_LDFLAGS"
|
|
|
|
|
+
|
|
|
|
|
+# 检查关键功能是否被启用
|
|
|
|
|
+echo ""
|
|
|
|
|
+echo "检查编译配置..."
|
|
|
|
|
+
|
|
|
|
|
+CONFIG_OK=true
|
|
|
|
|
+
|
|
|
|
|
+# 检查 WHIP
|
|
|
|
|
+if grep -q "CONFIG_WHIP_MUXER=yes" ffbuild/config.mak 2>/dev/null; then
|
|
|
|
|
+ echo "✅ WHIP muxer 已启用"
|
|
|
|
|
+else
|
|
|
|
|
+ echo "❌ WHIP muxer 未启用"
|
|
|
|
|
+ CONFIG_OK=false
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+# 检查 libx264
|
|
|
|
|
+if grep -q "CONFIG_LIBX264_ENCODER=yes" ffbuild/config.mak 2>/dev/null; then
|
|
|
|
|
+ echo "✅ libx264 编码器已启用"
|
|
|
|
|
+else
|
|
|
|
|
+ echo "❌ libx264 编码器未启用"
|
|
|
|
|
+ CONFIG_OK=false
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+# 检查 libopus
|
|
|
|
|
+if grep -q "CONFIG_LIBOPUS_ENCODER=yes" ffbuild/config.mak 2>/dev/null; then
|
|
|
|
|
+ echo "✅ libopus 编码器已启用"
|
|
|
|
|
+else
|
|
|
|
|
+ echo "❌ libopus 编码器未启用"
|
|
|
|
|
+ CONFIG_OK=false
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+if [ "$CONFIG_OK" = false ]; then
|
|
|
|
|
+ echo ""
|
|
|
|
|
+ echo "调试信息:"
|
|
|
|
|
+ grep -E "(openssl|dtls|whip|x264|opus)" ffbuild/config.mak 2>/dev/null | head -20 || true
|
|
|
|
|
+ echo ""
|
|
|
|
|
+ echo "可能原因:"
|
|
|
|
|
+ echo " 1. 依赖库未正确安装"
|
|
|
|
|
+ echo " 2. 库路径未正确配置"
|
|
|
|
|
+ echo ""
|
|
|
|
|
+ exit 1
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+echo ""
|
|
|
|
|
+echo "编译 FFmpeg (这可能需要 10-20 分钟)..."
|
|
|
|
|
+make -j$NPROC
|
|
|
|
|
+
|
|
|
|
|
+echo "安装 FFmpeg..."
|
|
|
|
|
+sudo make install
|
|
|
|
|
+
|
|
|
|
|
+echo "✅ FFmpeg 编译完成"
|
|
|
|
|
+echo ""
|
|
|
|
|
+
|
|
|
|
|
+# ==================== 步骤 3: 验证 ====================
|
|
|
|
|
+echo "┌──────────────────────────────────────────────────────────────┐"
|
|
|
|
|
+echo "│ 步骤 3/3: 验证安装 │"
|
|
|
|
|
+echo "└──────────────────────────────────────────────────────────────┘"
|
|
|
|
|
+
|
|
|
|
|
+echo "FFmpeg 版本:"
|
|
|
|
|
+"$INSTALL_PREFIX/bin/ffmpeg" -version | head -3
|
|
|
|
|
+
|
|
|
|
|
+echo ""
|
|
|
|
|
+echo "功能检查:"
|
|
|
|
|
+
|
|
|
|
|
+# WHIP 支持
|
|
|
|
|
+if "$INSTALL_PREFIX/bin/ffmpeg" -formats 2>/dev/null | grep -q whip; then
|
|
|
|
|
+ echo "✅ WHIP 格式支持已启用"
|
|
|
|
|
+ "$INSTALL_PREFIX/bin/ffmpeg" -formats 2>/dev/null | grep whip
|
|
|
|
|
+else
|
|
|
|
|
+ echo "❌ WHIP 格式支持未找到"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+# libx264 编码器
|
|
|
|
|
+if "$INSTALL_PREFIX/bin/ffmpeg" -encoders 2>/dev/null | grep -q libx264; then
|
|
|
|
|
+ echo "✅ libx264 编码器已启用"
|
|
|
|
|
+else
|
|
|
|
|
+ echo "❌ libx264 编码器未找到"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+# libopus 编码器
|
|
|
|
|
+if "$INSTALL_PREFIX/bin/ffmpeg" -encoders 2>/dev/null | grep -q libopus; then
|
|
|
|
|
+ echo "✅ libopus 编码器已启用"
|
|
|
|
|
+else
|
|
|
|
|
+ echo "❌ libopus 编码器未找到"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+echo ""
|
|
|
|
|
+echo "╔══════════════════════════════════════════════════════════════╗"
|
|
|
|
|
+echo "║ ✅ 编译完成! ║"
|
|
|
|
|
+echo "╠══════════════════════════════════════════════════════════════╣"
|
|
|
|
|
+echo "║ FFmpeg 路径: $INSTALL_PREFIX/bin/ffmpeg"
|
|
|
|
|
+echo "║ ║"
|
|
|
|
|
+echo "║ 部署应用: ║"
|
|
|
|
|
+echo "║ cd /home/fyd/tp/tg-live-game-service ║"
|
|
|
|
|
+echo "║ ./scripts/deploy.sh ║"
|
|
|
|
|
+echo "╚══════════════════════════════════════════════════════════════╝"
|