编译iOS系统可用的FFmpeg

在进行编译之前,需要做一些准备工作安装必备文件:

1  安装 gas-preprocessor

FFmpeg-iOS-build-script 自动编译脚本需要使用到 gas-preprocessor .

执行

sudo git clone https://github.com/bigsen/gas-preprocessor.git  /usr/local/bin/gas
sudo cp /usr/local/bin/gas/gas-preprocessor.pl /usr/local/bin/gas-preprocessor.pl
sudo chmod 777 /usr/local/bin/gas-preprocessor.pl
sudo rm -rf /usr/local/bin/gas/

2   安装 yams

brew install yams

3   下载编译脚本

git clone https://github.com/kewlbear/FFmpeg-iOS-build-script.git

4 执行脚本

cd 到 FFmpeg-iOS-build-script目录

cd FFmpeg-iOS-build-script

./build-ffmpeg.sh

耐心等待,此脚本会自动下载脚本中对应的FFmpeg 版本,然后编译,最后将生成的库放到FFmpeg-IOS目录中。

脚本如下:

#!/bin/sh# ffmpeg版本
FF_VERSION="4.3.6"
#FF_VERSION="snapshot-git"
if [[ $FFMPEG_VERSION != "" ]]; thenFF_VERSION=$FFMPEG_VERSION
fi
SOURCE="ffmpeg-$FF_VERSION"
FAT="FFmpeg-iOS"SCRATCH="scratch"
# must be an absolute path
THIN=`pwd`/"thin"# absolute path to x264 library
#X264=`pwd`/fat-x264#FDK_AAC=`pwd`/../fdk-aac-build-script-for-iOS/fdk-aac-iosCONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs \--disable-doc --enable-pic"if [ "$X264" ]
thenCONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-gpl --enable-libx264"
fiif [ "$FDK_AAC" ]
thenCONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-libfdk-aac --enable-nonfree"
fi# avresample
#CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-avresample"ARCHS="arm64 armv7 x86_64 i386"COMPILE="y"
LIPO="y"DEPLOYMENT_TARGET="10.0"if [ "$*" ]
thenif [ "$*" = "lipo" ]then# skip compileCOMPILE=elseARCHS="$*"if [ $# -eq 1 ]then# skip lipoLIPO=fifi
fiif [ "$COMPILE" ]
thenif [ ! `which yasm` ]thenecho 'Yasm not found'if [ ! `which brew` ]thenecho 'Homebrew not found. Trying to install...'ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" \|| exit 1fiecho 'Trying to install Yasm...'brew install yasm || exit 1fiif [ ! `which gas-preprocessor.pl` ]thenecho 'gas-preprocessor.pl not found. Trying to install...'(curl -L https://github.com/libav/gas-preprocessor/raw/master/gas-preprocessor.pl \-o /usr/local/bin/gas-preprocessor.pl \&& chmod +x /usr/local/bin/gas-preprocessor.pl) \|| exit 1fiif [ ! -r $SOURCE ]thenecho 'FFmpeg source not found. Trying to download...'curl http://www.ffmpeg.org/releases/$SOURCE.tar.bz2 | tar xj \|| exit 1fiCWD=`pwd`for ARCH in $ARCHSdoecho "building $ARCH..."mkdir -p "$SCRATCH/$ARCH"cd "$SCRATCH/$ARCH"CFLAGS="-arch $ARCH"if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]thenPLATFORM="iPhoneSimulator"CFLAGS="$CFLAGS -mios-simulator-version-min=$DEPLOYMENT_TARGET"elsePLATFORM="iPhoneOS"CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET -fembed-bitcode"if [ "$ARCH" = "arm64" ]thenEXPORT="GASPP_FIX_XCODE5=1"fifiXCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`CC="xcrun -sdk $XCRUN_SDK clang"# force "configure" to use "gas-preprocessor.pl" (FFmpeg 3.3)if [ "$ARCH" = "arm64" ]thenAS="gas-preprocessor.pl -arch aarch64 -- $CC"elseAS="gas-preprocessor.pl -- $CC"fiCXXFLAGS="$CFLAGS"LDFLAGS="$CFLAGS"if [ "$X264" ]thenCFLAGS="$CFLAGS -I$X264/include"LDFLAGS="$LDFLAGS -L$X264/lib"fiif [ "$FDK_AAC" ]thenCFLAGS="$CFLAGS -I$FDK_AAC/include"LDFLAGS="$LDFLAGS -L$FDK_AAC/lib"fiTMPDIR=${TMPDIR/%\/} $CWD/$SOURCE/configure \--target-os=darwin \--arch=$ARCH \--cc="$CC" \--as="$AS" \$CONFIGURE_FLAGS \--extra-cflags="$CFLAGS" \--extra-ldflags="$LDFLAGS" \--prefix="$THIN/$ARCH" \|| exit 1make -j4 install $EXPORT || exit 1cd $CWDdone
fiif [ "$LIPO" ]
thenecho "building fat binaries..."mkdir -p $FAT/libset - $ARCHSCWD=`pwd`cd $THIN/$1/libfor LIB in *.adocd $CWDecho lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB 1>&2lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB || exit 1donecd $CWDcp -rf $THIN/$1/include $FAT
fiecho Done

这里使用的是4.3.6版本,目前最新版本已经更新到6.0+

在ffmpeg源码目录下,终端执行 ./configure --help可用查看全部参数。根据自己需要可以修改脚本中对应的编译参数。

最新版编译报错问题

 FFmpeg-5.0以上编译,报audiotoolbox错误

src/libavdevice/audiotoolbox.m:78:5: error: unknown type name 'AudioDeviceID'; did you mean 'AudioFileID'?
    AudioDeviceID *devices;
    ^~~~~~~~~~~~~
    AudioFileID
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.2.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers/AudioFile.h:197:35: note: 'AudioFileID' declared here
typedef struct OpaqueAudioFileID        *AudioFileID;
                                         ^
src/libavdevice/audiotoolbox.m:84:5: error: use of undeclared identifier 'AudioObjectPropertyAddress'
    AudioObjectPropertyAddress prop;

audiotoolbox 是对音频的硬编解码库。可以在 build-ffmpeg.sh 中的在CONFIGURE_FLAGS 后面字符串中加入: --disable-audiotoolbox 字符串就可以解决


CONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs \--disable-doc --enable-pic --disable-audiotoolbox"

另外注意:FFmpeg5.0以上的编译最低支持的系统版本是iOS 13.0。而且iOS 13.0以后不再支持i386架构,所以编译时要去掉 i386架构。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/66331.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 方式 部署 vue 项目 (docker + vue + nginx)

1.安装好 nginx 。 2. 把 vue 项目的源码克隆到确定目录下。用 git 管理,所以直接 git clone 到既定目录就行了。 如我的目录是:/root/jiangyu/projects/gentle_vue/gentle_vue_code 。 3. 项目打包: npm run build 复制 会自动生成 dist…

若依框架权限管理的RBAC模型介绍

若依框架的权限管理功能是基于【RBAC】来实现的,即:系统中所有的权限,都是基于角色来控制的。框架对权限的控制,不仅支持菜单的功能,还支持菜单中的每一个按钮的权限控制   RBAC(基于角色的访问控制&#…

Maven介绍,部署在eclipse中

目录 一.Maven介绍 1,什么是maven? 2. 为什么maven会在企业中大量使用? 3.没有使用maven的前后区别? 4.maven在Java开发中的实际效果图 二.maven部署在eclipse中 1.下载maven在其官方网址下载(当然实际下载也要根据个人的…

数据结构-带头双向循环链表的实现

前言 带头双向循环链表是一种重要的数据结构,它的结构是很完美的,它弥补了单链表的许多不足,让我们一起来了解一下它是如何实现的吧! 1.节点的结构 它的节点中存储着数据和两个指针,一个指针_prev用来记录前一个节点…

如何通知学生分班结果?这个代码源轻松搞定

传统通知学生分班结果的方式相对来说比较繁琐,同时也存在出错的风险。首先,传统方式通常是通过纸质通知单的形式将分班结果发放给学生。这就需要学校花费一定的人力和物力来打印、分发通知单,而且还需要确保通知单能够准确地送到每个学生手中…

OpenAI允许网站阻止其网络爬虫;谷歌推出类似Grammarly的语法检查功能

🦉 AI新闻 🚀 OpenAI推出新功能,允许网站阻止其网络爬虫抓取数据训练GPT模型 摘要:OpenAI最近推出了一个新功能,允许网站阻止其网络爬虫从其网站上抓取数据训练GPT模型。该功能通过在网站的Robots.txt文件中禁止GPTB…

图像的镜像变换之c++实现(qt + 不调包)

1.基本原理 1.水平镜像变化 设图像的宽度为width,则水平镜像变化的映射关系如下: 2.垂直镜像变化 设图像的宽度为height,则垂直镜像变化的映射关系如下: 2.代码实现(代码是我以前自学图像处理时写的,代码很…

Nature子刊 |肠道宏病毒组揭示百岁老人长寿秘诀

发表期刊:nature microbiology 发表时间:2023 影响因子:28.3 DOI: 10.1038/s41564-023-01370-6 研究背景 衰老是一种不可逆转的自然过程,随着年龄的增长,机体诸多方面出现功能性下降,与衰老相关的疾病&a…

设计模式之三大类

目录 设计模式分类 1.创建型模式(Creational Patters) 2.结构型模式(Structural Patterns) 3.行为型模式(Behavioral Patterns) 3.1命令模式(The Command Pattern) 2.1适配器模式 2.1.1Object and Class Adapters 设计模式分类 1.创建型模式(Creational Patters) Fato…

手撕数据结构之栈+例题

目录 一、栈的概念及结构 二、栈的头文件及基本框架 三、接口实现 1、对栈的初始化 2、栈的销毁 3、入栈操作 4、出栈操作 5、判断栈是否为空 6、返回栈顶元素 7、遍历栈 四、有效的括号 - 力扣(LeetCode) 题目描述: 思路&#xff…

Falco操作系统安全威胁监测利器

原理简介 Falco是一个开源的云原生安全工具,用于检测和防御容器和云原生环境中的安全威胁。它基于Linux内核的eBPF技术,通过监控系统调用和内核事件来实现安全检测和响应。 具体来说,Falco的实现原理如下: 1. 内核模块&#xf…

如何使用Spark/Flink等分布式计算引擎做网络入侵检测

如何使用Spark/Flink等分布式计算引擎做网络入侵检测 引言16 Distributed Abnormal Behavior Detection Approach Based on Deep Belief Network and Ensemble SVM Using Spark17 Spark configurations to optimize decision tree classification on UNSW-NB1518 A dynamic spa…