macOs上交叉编译ffmpeg及安装ffmpeg工具

本次编译是MacBookPro macOs14.6.1 (23G93)上进行的。

一.下载下载解压FFmpeg:

通过ffmpeg的下载页面下载需要的ffmpeg的版本:Download FFmpeg

下载的是ffmpeg-7.0.2.tar.xz版本。

解压ffmpeg-7.0.2.tar.xz:

bash 复制代码
    tar -xf ffmpeg-7.0.2.tar.xz

cd 进入ffmpeg-7.0.2的文件夹并查看:

二.编译FFmpeg:

在ffmpeg-7.0.2的目录下./configure:

如出现以上报错"nasm/yasm not found or too old. Use --disable-x86asm for a crippled build."说明原本系统中没有安装nasm及yasm软件。

下载解压安装nasm:

下载解压nasm:

bash 复制代码
curl -O https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/nasm-2.16.01.tar.gz
tar -xf nasm-2.16.01.tar.gz
cd nasm-2.16.01

进入nasm-2.16.01目录安装:

bash 复制代码
    ./configure
    make
    sudo make install

验证nasm是否安装成功:

bash 复制代码
    nasm -v

下载解压安装yasm:

下载解压yasm:

bash 复制代码
curl -O http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar -xf yasm-1.3.0.tar.gz
cd yasm-1.3.0

进入yasm-1.3.0安装yasm:

bash 复制代码
    ./configure
    make
    sudo make install

验证yasm是否安装成功:

bash 复制代码
    yasm --version

三.macOs系统Android平台的ffmpeg交叉编译:

NDK的下载:

这里使用Android Studio的工具管理下载的,在Android Studio的"settings"------>"Languages&Frameworks"------>"Android SDK"------>"SDK Tools"------>"NDK (Side by Side)"的方式。

查找NDK存放的位置:

根据SDK管理工具的位置信息查找NDK的路径位置:

在上面的../Android/sdk/ndk中即是Android Studio下在安装NDK存放的位置。

NDK环境变量的配置:

验证ndk:

bash 复制代码
    ndk-build -v

配置ffmpeg ndk交叉编译的.sh:

在ffmpeg-7.0.2目录文件夹下创建一个android文件夹及android_build.sh:

bash 复制代码
    sudo vim android_build.sh

加入如下代码

bash 复制代码
#!/bin/bash
# 用于编译android平台的脚本
 
# NDK所在目录
NDK_PATH=/Users/.../Library/Android/sdk/ndk/25.1.8937393  # tag1
# macOS 平台编译,其他平台看一下 $NDK_PATH/toolchains/llvm/prebuilt/ 下的文件夹名称
HOST_PLATFORM=darwin-x86_64  #tag1
# minSdkVersion
API=23
 
TOOLCHAINS="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM"
SYSROOT="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM/sysroot"
# 生成 -fpic 与位置无关的代码
CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID "
LDFLAG="-lc -lm -ldl -llog "
 
# 输出目录
PREFIX=`pwd`/android
# 日志输出目录
CONFIG_LOG_PATH=${PREFIX}/log
# 公共配置
COMMON_OPTIONS=
# 交叉配置
CONFIGURATION=
 
build() {
  APP_ABI=$1
  echo "======== > Start build $APP_ABI"
  case ${APP_ABI} in
  armeabi-v7a)
    ARCH="arm"
    CPU="armv7-a"
    MARCH="armv7-a"
    TARGET=armv7a-linux-androideabi
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    # 交叉编译工具前缀
    CROSS_PREFIX="$TOOLCHAINS/bin/arm-linux-androideabi-"
    EXTRA_CFLAGS="$CFLAG -mfloat-abi=softfp -mfpu=vfp -marm -march=$MARCH "
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS="--enable-neon --cpu=$CPU "
    ;;
  arm64-v8a)
    ARCH="aarch64"
    TARGET=$ARCH-linux-android
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"
    EXTRA_CFLAGS="$CFLAG"
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS=""
    ;;
  x86)
    ARCH="x86"
    CPU="i686"
    MARCH="i686"
    TARGET=i686-linux-android
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"
    #EXTRA_CFLAGS="$CFLAG -march=$MARCH -mtune=intel -mssse3 -mfpmath=sse -m32"
    EXTRA_CFLAGS="$CFLAG -march=$MARCH  -mssse3 -mfpmath=sse -m32"
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS="--cpu=$CPU "
    ;;
  x86_64)
    ARCH="x86_64"
    CPU="x86-64"
    MARCH="x86_64"
    TARGET=$ARCH-linux-android
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"
    #EXTRA_CFLAGS="$CFLAG -march=$CPU -mtune=intel -msse4.2 -mpopcnt -m64"
    EXTRA_CFLAGS="$CFLAG -march=$CPU -msse4.2 -mpopcnt -m64"
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS="--cpu=$CPU "
    ;;
  esac
 
  echo "-------- > Start clean workspace"
make clean
 
  echo "-------- > Start build configuration"
  CONFIGURATION="$COMMON_OPTIONS"
  CONFIGURATION="$CONFIGURATION --logfile=$CONFIG_LOG_PATH/config_$APP_ABI.log"
  CONFIGURATION="$CONFIGURATION --prefix=$PREFIX"
  CONFIGURATION="$CONFIGURATION --libdir=$PREFIX/libs/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --incdir=$PREFIX/includes/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --pkgconfigdir=$PREFIX/pkgconfig/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --cross-prefix=$CROSS_PREFIX"
  CONFIGURATION="$CONFIGURATION --arch=$ARCH"
  CONFIGURATION="$CONFIGURATION --sysroot=$SYSROOT"
  CONFIGURATION="$CONFIGURATION --cc=$CC"
  CONFIGURATION="$CONFIGURATION --cxx=$CXX"
  CONFIGURATION="$CONFIGURATION --ld=$LD"
  # nm 和 strip
  CONFIGURATION="$CONFIGURATION --nm=$TOOLCHAINS/bin/llvm-nm"
  CONFIGURATION="$CONFIGURATION --strip=$TOOLCHAINS/bin/llvm-strip"
  CONFIGURATION="$CONFIGURATION $EXTRA_OPTIONS"
 
  echo "-------- > Start config makefile with $CONFIGURATION --extra-cflags=${EXTRA_CFLAGS} --extra-ldflags=${EXTRA_LDFLAGS}"
  ./configure ${CONFIGURATION} \
  --extra-cflags="$EXTRA_CFLAGS" \
  --extra-ldflags="$EXTRA_LDFLAGS"
 
  echo "-------- > Start make $APP_ABI with -j1"
  make -j1
 
  echo "-------- > Start install $APP_ABI"
  make install
  echo "++++++++ > make and install $APP_ABI complete."
 
}
 
build_all() {
  #配置开源协议声明
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-gpl"
  #目标android平台
  COMMON_OPTIONS="$COMMON_OPTIONS --target-os=android"
  #取消默认的静态库
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-static"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-shared"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-protocols"
  #开启交叉编译
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-cross-compile"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-optimizations"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-debug"
  #尽可能小
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-small"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-doc"
  #不要命令(执行文件)
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-programs"  # do not build command line programs
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffmpeg"    # disable ffmpeg build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffplay"    # disable ffplay build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffprobe"   # disable ffprobe build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-symver"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-network"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-x86asm"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-asm"
  #启用
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-pthreads"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-mediacodec"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-jni"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-zlib"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-pic"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-muxer=flv"
  #COMMON_OPTIONS="$COMMON_OPTIONS --enable-avresample"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=h264"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mpeg4"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mjpeg"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=png"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=vorbis"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=opus"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=flac"
  echo "COMMON_OPTIONS=$COMMON_OPTIONS"
  echo "PREFIX=$PREFIX"
  echo "CONFIG_LOG_PATH=$CONFIG_LOG_PATH"
  mkdir -p ${CONFIG_LOG_PATH}
  #build "armeabi-v7a"
  build "arm64-v8a"
  #build "x86"
  #build "x86_64"
}
 
echo "-------- Start --------"
build_all
echo "-------- End --------"

编译android_build.sh:

bash 复制代码
    sudo sh android_build.sh

交叉编译结果:

经过一段时间的编译后,在前面创建的./ffmpeg/ffmpeg7.0.2/android文件夹中如下编译的结果:

四.macOs上安装FFmpeg工具

下载FFmpeg工具并解压:

进入static FFmpeg binaries for macOS 64-bit Intel下载ffmpeg/ffplay/ffprob/ffserver四个工具。

可以在自己的文件目录下创建一个.../ffmpeg/bin/用于存放这四个解压后的工具。

ffmpeg工具环境变量的配置:

查找ffmpeg工具存放的文件目录:

找到完整的../ffmpeg/bin路径之后再进行下一步。

ffmpeg环境变量的配置:

打开编辑~/.bash_profile:
bash 复制代码
    sudo vim ~/.bash_profile
添加ffmpeg环境:

由上得到"../ffmpeg/bin"完整路径,在~/.bash_profile中添加如下:

vim编辑完成后":wq"保存退出
更新~/.bash_profile:
bash 复制代码
    source ~/.bash_profile

验证工具是否可用:

验证ffprobe:
bash 复制代码
    ffprobe -version

会弹出如下警告:

解除警告⚠️,在设置------>隐私与安全性------>允许✅即可。

直到如下验证成功即可:

验证ffmpeg:

出现警告⚠️,安上述操作消除警告即可。

bash 复制代码
ffmpeg -version
验证ffplay:

出现警告⚠️,安上述操作消除警告即可。

bash 复制代码
    ffplay -version
验证ffserver:
bash 复制代码
    ffserver -version
相关推荐
小小程序员mono1 小时前
WWDC 2026 之后,M5 桌面 Mac 上市时间预测
macos·ios·wwdc
yuguo.im2 小时前
Mac M4 安装 sd-webui 踩坑全记录
macos·stable diffusion
luoyayun3613 小时前
Qt + FFmpeg 实战:音频静音段检测
qt·ffmpeg·音视频·静音段检测
守城小轩3 小时前
Chromium 146 编译指南 macOS篇:获取源代码(四)
macos
comcoo4 小时前
避坑指南:OpenClaw v2.7.9 Windows/macOS 零基础安装全过程
人工智能·windows·macos·github·开源软件·open claw·open claw部署包
robinLi09134 小时前
docker mac 下载不同系统架构镜像
macos·docker·容器
卡卡西Sensei4 小时前
2026 苹果 WWDC 完整总结
macos·ios·wwdc
Tr2e19 小时前
🐱 从 0 到 1:用 Swift 手搓一个 macOS 桌面宠物(附源码)
macos·ios·swift
Mac技巧大咖1 天前
macOS 27 或成 Intel Mac 分水岭:老款 Mac 用户升级前要注意什么?
macos·macos 27
上天_去_做颗惺星 EVE_BLUE1 天前
【新 Linux 服务器上手全攻略】系统巡检、存储规划与开发环境初始化
linux·运维·服务器·ubuntu·macos·centos