whip.sh 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. #!/bin/bash
  2. # ============================================
  3. # FFmpeg WHIP 支持编译脚本
  4. # 智能检测:已安装则跳过,未安装则编译
  5. # ============================================
  6. set -e
  7. # 配置
  8. BUILD_DIR="$HOME/ffmpeg-whip-build"
  9. INSTALL_PREFIX="/usr/local/ffmpeg-whip"
  10. NPROC=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
  11. echo ""
  12. echo "╔══════════════════════════════════════════════════════════════╗"
  13. echo "║ FFmpeg WHIP 支持编译脚本 (智能检测版) ║"
  14. echo "║ 编译目录: $BUILD_DIR"
  15. echo "║ 安装目录: $INSTALL_PREFIX"
  16. echo "║ CPU 核心: $NPROC"
  17. echo "╚══════════════════════════════════════════════════════════════╝"
  18. echo ""
  19. # ==================== 检查是否已安装 ====================
  20. echo "┌──────────────────────────────────────────────────────────────┐"
  21. echo "│ 预检查: FFmpeg WHIP 支持 │"
  22. echo "└──────────────────────────────────────────────────────────────┘"
  23. if [ -x "$INSTALL_PREFIX/bin/ffmpeg" ]; then
  24. WHIP_CHECK=$("$INSTALL_PREFIX/bin/ffmpeg" -formats 2>/dev/null | grep -c "whip" || echo 0)
  25. if [ "$WHIP_CHECK" -gt 0 ]; then
  26. echo "✅ FFmpeg WHIP 已安装,无需重新编译"
  27. "$INSTALL_PREFIX/bin/ffmpeg" -version | head -1
  28. echo ""
  29. echo "如需强制重新编译,请删除后再运行:"
  30. echo " sudo rm -rf $INSTALL_PREFIX"
  31. echo " ./scripts/build-ffmpeg-whip.sh"
  32. exit 0
  33. fi
  34. fi
  35. echo "未检测到支持 WHIP 的 FFmpeg,开始编译..."
  36. echo ""
  37. # 创建目录
  38. mkdir -p "$BUILD_DIR"
  39. cd "$BUILD_DIR"
  40. # ==================== 步骤 1: 安装依赖 ====================
  41. echo "┌──────────────────────────────────────────────────────────────┐"
  42. echo "│ 步骤 1/3: 检查并安装依赖 │"
  43. echo "└──────────────────────────────────────────────────────────────┘"
  44. install_deps_centos() {
  45. echo "检测到 CentOS/RHEL,检查依赖..."
  46. # 检查 Development Tools
  47. if ! rpm -q gcc &>/dev/null; then
  48. echo "安装 Development Tools..."
  49. sudo yum groupinstall -y "Development Tools"
  50. else
  51. echo "✓ Development Tools 已安装"
  52. fi
  53. # 尝试安装 EPEL (需要先安装,因为 x264 在 EPEL 里)
  54. if ! rpm -q epel-release &>/dev/null; then
  55. echo "安装 EPEL..."
  56. sudo yum install -y epel-release || true
  57. fi
  58. # 检查其他依赖
  59. DEPS="cmake git openssl-devel nasm x264-devel opus-devel"
  60. for dep in $DEPS; do
  61. if ! rpm -q $dep &>/dev/null; then
  62. echo "安装 $dep..."
  63. sudo yum install -y $dep || true
  64. else
  65. echo "✓ $dep 已安装"
  66. fi
  67. done
  68. }
  69. install_deps_ubuntu() {
  70. echo "检测到 Debian/Ubuntu,检查依赖..."
  71. DEPS="build-essential cmake git pkg-config libssl-dev nasm libx264-dev libopus-dev"
  72. MISSING=""
  73. for dep in $DEPS; do
  74. if ! dpkg -s $dep &>/dev/null; then
  75. MISSING="$MISSING $dep"
  76. else
  77. echo "✓ $dep 已安装"
  78. fi
  79. done
  80. if [ -n "$MISSING" ]; then
  81. echo "安装缺失依赖:$MISSING"
  82. sudo apt-get update
  83. sudo apt-get install -y $MISSING
  84. fi
  85. }
  86. install_deps_macos() {
  87. echo "检测到 macOS,检查依赖..."
  88. DEPS="cmake openssl nasm pkg-config x264 opus"
  89. for dep in $DEPS; do
  90. if ! brew list $dep &>/dev/null; then
  91. echo "安装 $dep..."
  92. brew install $dep || true
  93. else
  94. echo "✓ $dep 已安装"
  95. fi
  96. done
  97. }
  98. # 根据系统选择安装方式
  99. if [[ "$OSTYPE" == "darwin"* ]]; then
  100. install_deps_macos
  101. elif command -v yum &>/dev/null; then
  102. install_deps_centos
  103. elif command -v apt-get &>/dev/null; then
  104. install_deps_ubuntu
  105. elif command -v dnf &>/dev/null; then
  106. echo "检测到 Fedora/RHEL 8+,使用 dnf..."
  107. sudo dnf groupinstall -y "Development Tools"
  108. sudo dnf install -y epel-release || true
  109. sudo dnf install -y cmake git openssl-devel nasm x264-devel opus-devel
  110. else
  111. echo "⚠️ 未知系统,请手动安装: cmake git openssl-devel nasm"
  112. fi
  113. echo "✅ 依赖检查完成"
  114. echo ""
  115. # ==================== 步骤 2: 编译 FFmpeg ====================
  116. echo "┌──────────────────────────────────────────────────────────────┐"
  117. echo "│ 步骤 2/3: 编译 FFmpeg (支持 WHIP) │"
  118. echo "└──────────────────────────────────────────────────────────────┘"
  119. cd "$BUILD_DIR"
  120. if [ ! -d "ffmpeg-git" ]; then
  121. echo "下载 FFmpeg 源码..."
  122. git clone --depth 1 https://git.ffmpeg.org/ffmpeg.git ffmpeg-git
  123. else
  124. echo "FFmpeg 源码已存在,重置到最新版本..."
  125. cd ffmpeg-git
  126. git fetch origin
  127. git reset --hard origin/master
  128. cd ..
  129. fi
  130. cd ffmpeg-git
  131. # ==================== 应用 WHIP Bug 修复 ====================
  132. echo ""
  133. echo "应用 WHIP muxer 补丁..."
  134. WHIP_FILE="libavformat/whip.c"
  135. if [ -f "$WHIP_FILE" ]; then
  136. # 跨平台 sed 函数 (兼容 macOS 和 Linux)
  137. sed_inplace() {
  138. if [[ "$OSTYPE" == "darwin"* ]]; then
  139. sed -i '' "$@"
  140. else
  141. sed -i "$@"
  142. fi
  143. }
  144. # Bug Fix #1: rtcp-fb 缺少冒号
  145. if grep -q '"a=rtcp-fb%u' "$WHIP_FILE"; then
  146. echo " 修复 Bug #1: rtcp-fb 缺少冒号..."
  147. sed_inplace 's/"a=rtcp-fb%u/"a=rtcp-fb:%u/g' "$WHIP_FILE"
  148. echo " ✓ Bug #1 已修复"
  149. else
  150. echo " ✓ Bug #1 已经修复或不存在"
  151. fi
  152. # Bug Fix #2: BUNDLE 和 mid 硬编码问题 (针对 video-only 模式)
  153. if grep -q 'BUNDLE 0 1' "$WHIP_FILE"; then
  154. echo " 修复 Bug #2: BUNDLE/mid 硬编码问题..."
  155. cp "$WHIP_FILE" "${WHIP_FILE}.orig"
  156. sed_inplace 's/BUNDLE 0 1/BUNDLE 0/g' "$WHIP_FILE"
  157. sed_inplace 's/"a=mid:1\\r\\n"/"a=mid:0\\r\\n"/g' "$WHIP_FILE"
  158. if ! grep -q 'BUNDLE 0 1' "$WHIP_FILE"; then
  159. echo " ✓ Bug #2 已修复 (BUNDLE 改为 0, 支持 video-only 模式)"
  160. else
  161. echo " ⚠ BUNDLE 修复可能未完全生效"
  162. fi
  163. else
  164. echo " ✓ Bug #2 已经修复或不存在"
  165. fi
  166. echo "✅ WHIP 补丁应用完成"
  167. else
  168. echo "⚠️ 未找到 WHIP 源文件,跳过补丁"
  169. fi
  170. echo ""
  171. echo "配置 FFmpeg..."
  172. # 清理之前的编译
  173. make distclean 2>/dev/null || true
  174. # 设置编译参数
  175. EXTRA_CFLAGS=""
  176. EXTRA_LDFLAGS=""
  177. # macOS 特殊处理: OpenSSL, x264, opus 路径
  178. if [[ "$OSTYPE" == "darwin"* ]]; then
  179. OPENSSL_PREFIX=$(brew --prefix openssl)
  180. X264_PREFIX=$(brew --prefix x264)
  181. OPUS_PREFIX=$(brew --prefix opus)
  182. export PKG_CONFIG_PATH="$OPENSSL_PREFIX/lib/pkgconfig:$X264_PREFIX/lib/pkgconfig:$OPUS_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH"
  183. EXTRA_CFLAGS="-I$OPENSSL_PREFIX/include -I$X264_PREFIX/include -I$OPUS_PREFIX/include"
  184. EXTRA_LDFLAGS="-L$OPENSSL_PREFIX/lib -L$X264_PREFIX/lib -L$OPUS_PREFIX/lib"
  185. echo "macOS 库路径:"
  186. echo " OpenSSL: $OPENSSL_PREFIX"
  187. echo " x264: $X264_PREFIX"
  188. echo " opus: $OPUS_PREFIX"
  189. fi
  190. echo "PKG_CONFIG_PATH: $PKG_CONFIG_PATH"
  191. echo ""
  192. # 配置 FFmpeg
  193. # WHIP muxer 依赖: dtls_protocol -> openssl
  194. # 视频编码: libx264 (支持 -preset)
  195. # 音频编码: libopus
  196. ./configure \
  197. --prefix="$INSTALL_PREFIX" \
  198. --enable-gpl \
  199. --enable-nonfree \
  200. --enable-openssl \
  201. --enable-libx264 \
  202. --enable-libopus \
  203. --extra-cflags="$EXTRA_CFLAGS" \
  204. --extra-ldflags="$EXTRA_LDFLAGS"
  205. # 检查关键功能是否被启用
  206. echo ""
  207. echo "检查编译配置..."
  208. CONFIG_OK=true
  209. # 检查 WHIP
  210. if grep -q "CONFIG_WHIP_MUXER=yes" ffbuild/config.mak 2>/dev/null; then
  211. echo "✅ WHIP muxer 已启用"
  212. else
  213. echo "❌ WHIP muxer 未启用"
  214. CONFIG_OK=false
  215. fi
  216. # 检查 libx264
  217. if grep -q "CONFIG_LIBX264_ENCODER=yes" ffbuild/config.mak 2>/dev/null; then
  218. echo "✅ libx264 编码器已启用"
  219. else
  220. echo "❌ libx264 编码器未启用"
  221. CONFIG_OK=false
  222. fi
  223. # 检查 libopus
  224. if grep -q "CONFIG_LIBOPUS_ENCODER=yes" ffbuild/config.mak 2>/dev/null; then
  225. echo "✅ libopus 编码器已启用"
  226. else
  227. echo "❌ libopus 编码器未启用"
  228. CONFIG_OK=false
  229. fi
  230. if [ "$CONFIG_OK" = false ]; then
  231. echo ""
  232. echo "调试信息:"
  233. grep -E "(openssl|dtls|whip|x264|opus)" ffbuild/config.mak 2>/dev/null | head -20 || true
  234. echo ""
  235. echo "可能原因:"
  236. echo " 1. 依赖库未正确安装"
  237. echo " 2. 库路径未正确配置"
  238. echo ""
  239. exit 1
  240. fi
  241. echo ""
  242. echo "编译 FFmpeg (这可能需要 10-20 分钟)..."
  243. make -j$NPROC
  244. echo "安装 FFmpeg..."
  245. sudo make install
  246. echo "✅ FFmpeg 编译完成"
  247. echo ""
  248. # ==================== 步骤 3: 验证 ====================
  249. echo "┌──────────────────────────────────────────────────────────────┐"
  250. echo "│ 步骤 3/3: 验证安装 │"
  251. echo "└──────────────────────────────────────────────────────────────┘"
  252. echo "FFmpeg 版本:"
  253. "$INSTALL_PREFIX/bin/ffmpeg" -version | head -3
  254. echo ""
  255. echo "功能检查:"
  256. # WHIP 支持
  257. if "$INSTALL_PREFIX/bin/ffmpeg" -formats 2>/dev/null | grep -q whip; then
  258. echo "✅ WHIP 格式支持已启用"
  259. "$INSTALL_PREFIX/bin/ffmpeg" -formats 2>/dev/null | grep whip
  260. else
  261. echo "❌ WHIP 格式支持未找到"
  262. exit 1
  263. fi
  264. # libx264 编码器
  265. if "$INSTALL_PREFIX/bin/ffmpeg" -encoders 2>/dev/null | grep -q libx264; then
  266. echo "✅ libx264 编码器已启用"
  267. else
  268. echo "❌ libx264 编码器未找到"
  269. exit 1
  270. fi
  271. # libopus 编码器
  272. if "$INSTALL_PREFIX/bin/ffmpeg" -encoders 2>/dev/null | grep -q libopus; then
  273. echo "✅ libopus 编码器已启用"
  274. else
  275. echo "❌ libopus 编码器未找到"
  276. exit 1
  277. fi
  278. echo ""
  279. echo "╔══════════════════════════════════════════════════════════════╗"
  280. echo "║ ✅ 编译完成! ║"
  281. echo "╠══════════════════════════════════════════════════════════════╣"
  282. echo "║ FFmpeg 路径: $INSTALL_PREFIX/bin/ffmpeg"
  283. echo "║ ║"
  284. echo "║ 部署应用: ║"
  285. echo "║ cd /home/fyd/tp/tg-live-game-service ║"
  286. echo "║ ./scripts/deploy.sh ║"
  287. echo "╚══════════════════════════════════════════════════════════════╝"