当前位置: 首页 > news >正文

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:

    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:

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目录安装:

    ./configuremakesudo make install

        验证nasm是否安装成功:   

    nasm -v

        

 

        下载解压安装yasm: 

        下载解压yasm:       

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:

    ./configuremakesudo make install

        验证yasm是否安装成功:

    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:

    ndk-build -v

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

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

    sudo vim android_build.sh

        加入如下代码

#!/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=23TOOLCHAINS="$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=$1echo "======== > Start build $APP_ABI"case ${APP_ABI} inarmeabi-v7a)ARCH="arm"CPU="armv7-a"MARCH="armv7-a"TARGET=armv7a-linux-androideabiCC="$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-androidCC="$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-androidCC="$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-androidCC="$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 ";;esacecho "-------- > Start clean workspace"
make cleanecho "-------- > 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 和 stripCONFIGURATION="$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 -j1echo "-------- > Start install $APP_ABI"make installecho "++++++++ > 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 programsCOMMON_OPTIONS="$COMMON_OPTIONS --disable-ffmpeg"    # disable ffmpeg buildCOMMON_OPTIONS="$COMMON_OPTIONS --disable-ffplay"    # disable ffplay buildCOMMON_OPTIONS="$COMMON_OPTIONS --disable-ffprobe"   # disable ffprobe buildCOMMON_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:

    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:
    sudo vim ~/.bash_profile
       添加ffmpeg环境:

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

         vim编辑完成后“:wq”保存退出

        更新~/.bash_profile:
    source ~/.bash_profile

        验证工具是否可用:

        验证ffprobe:
    ffprobe -version

        会弹出如下警告: 

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

        直到如下验证成功即可:

        

        验证ffmpeg:

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

ffmpeg -version

        验证ffplay:

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

    ffplay -version

        验证ffserver:
    ffserver -version

http://www.lryc.cn/news/594195.html

相关文章:

  • Facebook 开源多季节性时间序列数据预测工具:Prophet 饱和预测 Saturating Forecasts
  • lvs调度算法(10种)
  • DOM型XSS破坏
  • MySQL锁(二) 共享锁与互斥锁
  • pages.json页面路由中,globalStyle的各个属性
  • 两个数据表的故事:第 1 部分
  • 测试中的bug
  • LVS-----TUN模式配置
  • 20250720-6-Kubernetes 调度-nodeName字段,DaemonS_笔记
  • Pinia 核心知识详解:Vue3 新一代状态管理指南
  • spring-cloud使用
  • 【数据结构】揭秘二叉树与堆--用C语言实现堆
  • 数据结构-线性表顺序表示
  • PrimeTime:高级片上变化(AOCV)
  • 小红书 MCP 服务器
  • Vue 3中reactive、ref、watchEffect和watch的底层原理及核心区别解析
  • SQL189 牛客直播各科目同时在线人数
  • SQL 调优第一步:EXPLAIN 关键字全解析
  • [Java恶补day44] 整理模板·考点七【二叉树】
  • Docker Desktop 入门教程(Windows macOS)
  • HTTP 进化史:从 1.0 到 3.0
  • The FastMCP Client
  • 你的created_time字段,用DATETIME还是TIMESTAMP?
  • Python自动化测试项目实战
  • Python 模块与包导入 基础讲解
  • Haproxy算法精简化理解及企业级高功能实战
  • 如何在看板中体现任务依赖关系
  • Windows CMD(命令提示符)中最常用的命令汇总和实战示例
  • 让黑窗口变彩色:C++控制台颜色修改指南
  • 30天打牢数模基础-SVM讲解