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
相关推荐
aqi0017 小时前
FFmpeg开发笔记(九十六)采用Kotlin+Compose的视频编辑器OpenVideoEditor
android·ffmpeg·kotlin·音视频·流媒体
胖祥19 小时前
ffmpeg之ff_filter_graph_run_once功能
ffmpeg
李玮豪Jimmy20 小时前
MacOS 上安装 JDK 并实现多版本灵活切换
macos
mixboot20 小时前
VoxCPM 1.5.0 macOS
macos·voxcpm
甜可儿20 小时前
mac环境安装不同版本maven
java·macos·maven
bl4ckpe4ch20 小时前
从零开始Mac OS 开荒整理笔记
笔记·macos·开荒
aqi002 天前
FFmpeg开发笔记(九十五)国产的开源视频美颜工具VideoEditorForAndroid
android·ffmpeg·音视频·直播·流媒体
张飞签名上架2 天前
深耕全球市场:App上架iOS与Google Play全流程指南
macos·ios·cocoa·ios上架·上架·谷歌上架
DisonTangor2 天前
Mac Studio配备1.5 TB显存——基于雷电5的远程直接内存访问技术
人工智能·macos·开源·aigc
天庭鸡腿哥2 天前
输入序列号,可激活正版软件!
microsoft·macos·visual studio·everything