FFmpeg 编译静态库

news/2024/7/10 19:37:56 标签: iOS, FFmpeg, Objective-C

1. 使用工具

  1.1 FFmpeg 官网:

  1.2 FFmpeg macOS 官方安装教程:

  1.3 Homebreaw 安装网站:

2. Homebreaw 介绍

  2.1 简称 brew,在 Mac 平台终端上管理软件包,安装,更新,卸载等软件

  2.2 安装 brew,终端执行指令(内部安装): 

  // ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
  // /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
  /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

  2.3 出现安装或者更新问题:

    错误:Error: Cannot download non-corrupt https://formulae.brew.sh/api/formula.json!

    解决网址: brew upgrade error:

  2.4 常用命令

    搜索软件 brew search  软件名;安装软件 brew install 软件名;卸载软件 brew remove  软件名;

  2.5 安装 FFmpeg(可选项,使用到 ffmpeg 命令行操作,必须安装)

    安装完 Homebrew,然后在终端执行指令:

// brew install ffmpeg --with-libvpx --with-libvorbis --with-ffplay
brew install ffmpeg

    执行结束,在终端中输入 ffmpeg,验证是否安装成功 

3. 编译静态库

  3.1 下载 gas-preprocessor 库(自动编译脚本的时候用到),方法一: 可以手动下载操作,方法二: 命令下载步骤,依次执行下面命令:

// https://github.com/bigsen/gas-preprocessor.git
sudo git clone https://github.com/libav/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/

  3.2 安装 yams (系统现已找不到 yams 库进行安装,自带有 yaws,可进行安装) 

    yasm 是汇编编译器,ffmpeg 中提高效率用到了汇编指令,所以编译时需要安装,安装执行下面命令:

 // 报错则执行 sudo brew install yams
 brew install yams

4. 配置编译 FFmpeg 脚本

  手动编译 FFmpeg 脚本,有些复杂,这里选择的是 FFmpeg-iOS-build-script,github 一个开源的脚本,个人认为简单而实用,执行脚本会自动从 github 下载 ffmpeg 源码,并开始编译成 iOS 支持各种架构库。

  4.1 脚本下载地址,也可手动点击下载

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

  4.2 下载完成后,可自行修改脚本文件,自带脚本:

#!/bin/sh

# directories
FF_VERSION="4.3.1"
#FF_VERSION="snapshot-git"
if [[ $FFMPEG_VERSION != "" ]]; then
  FF_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-ios

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

if [ "$X264" ]
then
    CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-gpl --enable-libx264"
fi

if [ "$FDK_AAC" ]
then
    CONFIGURE_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="8.0"

if [ "$*" ]
then
    if [ "$*" = "lipo" ]
    then
        # skip compile
        COMPILE=
    else
        ARCHS="$*"
        if [ $# -eq 1 ]
        then
            # skip lipo
            LIPO=
        fi
    fi
fi

if [ "$COMPILE" ]
then
    if [ ! `which yasm` ]
    then
        echo 'Yasm not found'
        if [ ! `which brew` ]
        then
            echo 'Homebrew not found. Trying to install...'
                        ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" \
                || exit 1
        fi
        echo 'Trying to install Yasm...'
        brew install yasm || exit 1
    fi
    if [ ! `which gas-preprocessor.pl` ]
    then
        echo '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 1
    fi

    if [ ! -r $SOURCE ]
    then
        echo 'FFmpeg source not found. Trying to download...'
        curl http://www.ffmpeg.org/releases/$SOURCE.tar.bz2 | tar xj \
            || exit 1
    fi

    CWD=`pwd`
    for ARCH in $ARCHS
    do
        echo "building $ARCH..."
        mkdir -p "$SCRATCH/$ARCH"
        cd "$SCRATCH/$ARCH"

        CFLAGS="-arch $ARCH"
        if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
        then
            PLATFORM="iPhoneSimulator"
            CFLAGS="$CFLAGS -mios-simulator-version-min=$DEPLOYMENT_TARGET"
        else
            PLATFORM="iPhoneOS"
            CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET -fembed-bitcode"
            if [ "$ARCH" = "arm64" ]
            then
                EXPORT="GASPP_FIX_XCODE5=1"
            fi
        fi

        XCRUN_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" ]
        then
            AS="gas-preprocessor.pl -arch aarch64 -- $CC"
        else
            AS="gas-preprocessor.pl -- $CC"
        fi

        CXXFLAGS="$CFLAGS"
        LDFLAGS="$CFLAGS"
        if [ "$X264" ]
        then
            CFLAGS="$CFLAGS -I$X264/include"
            LDFLAGS="$LDFLAGS -L$X264/lib"
        fi
        if [ "$FDK_AAC" ]
        then
            CFLAGS="$CFLAGS -I$FDK_AAC/include"
            LDFLAGS="$LDFLAGS -L$FDK_AAC/lib"
        fi

        TMPDIR=${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 1

        make -j3 install $EXPORT || exit 1
        cd $CWD
    done
fi

if [ "$LIPO" ]
then
    echo "building fat binaries..."
    mkdir -p $FAT/lib
    set - $ARCHS
    CWD=`pwd`
    cd $THIN/$1/lib
    for LIB in *.a
    do
        cd $CWD
        echo lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB 1>&2
        lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB || exit 1
    done

    cd $CWD
    cp -rf $THIN/$1/include $FAT
fi

echo Done

  4.3 脚本可根据需求修改的地方,如下图:

  4.4 编译裁剪库(可选项) 

    FFmpeg 库很庞大,不进行裁剪,编译出来的库也会很大,根据自身的需求,裁剪部分库中的内容,更改内容是在脚本文件中 CONFIGURE_FLAGS 对应的选项,进行更改之后的脚本: build-ffmpeg-simple.sh

#!/bin/sh

# directories
FF_VERSION="4.3.1"
#FF_VERSION="snapshot-git"
if [[ $FFMPEG_VERSION != "" ]]; then
  FF_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-ios

CONFIGURE_FLAGS="--enable-cross-compile \
                 --disable-debug \
                 --disable-programs \
                 --disable-doc \
                 --enable-pic \
                 --enable-small \
                 --enable-gpl \
                 --enable-network \
                 --enable-version3 \
                 --disable-ffplay \
                 --disable-ffprobe \
                 --disable-avdevice \
                 --disable-outdevs \
                 --disable-ffmpeg \
                 --disable-postproc \
                 --disable-symver \
                 --disable-stripping \
                 --disable-iconv \
                 --enable-asm \
                 --enable-neon \
                 --enable-zlib \
                 --disable-encoders \
                 --enable-encoder=h264_videotoolbox \
                 --enable-encoder=hevc_videotoolbox \
                 --enable-encoder=aac \
                 --disable-muxers \
                 --enable-muxer=h264 \
                 --enable-muxer=hevc \
                 --enable-muxer=rtsp \
                 --enable-muxer=dts \
                 --enable-muxer=adts \
                 --enable-muxer=mp3 \
                 --disable-decoders \
                 --enable-decoder=h264 \
                 --enable-decoder=hevc \
                 --enable-decoder=aac \
                 --enable-decoder=mp3 \
                 --disable-demuxers \
                 --enable-demuxer=h264 \
                 --enable-demuxer=hevc \
                 --enable-demuxer=rtsp \
                 --enable-demuxer=sdp \
                 --enable-demuxer=aac \
                 --enable-demuxer=mp3 \
                 --disable-parsers \
                 --enable-parser=aac \
                 --enable-parser=h264 \
                 --enable-parser=hevc \
                 --disable-protocols \
                 --enable-protocol=tcp \
                 --enable-protocol=file \
                 --enable-protocol=hls \
                 --enable-protocol=concat \
                 --enable-protocol=unix \
                 --disable-filters \
                 --enable-filter=aresample \
                 --enable-filter=asetpts \
                 --enable-filter=setpts \
                 --enable-filter=scale \
                 --enable-filter=concat \
                 --enable-filter=atempo \
                 --enable-filter=movie \
                 --enable-filter=overlay \
                 --enable-filter=rotate \
                 --enable-filter=format \
                 --enable-filter=transpose \
                 --enable-filter=hflip"

if [ "$X264" ]
then
    CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-gpl --enable-libx264"
fi

if [ "$FDK_AAC" ]
then
    CONFIGURE_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="8.0"

if [ "$*" ]
then
    if [ "$*" = "lipo" ]
    then
        # skip compile
        COMPILE=
    else
        ARCHS="$*"
        if [ $# -eq 1 ]
        then
            # skip lipo
            LIPO=
        fi
    fi
fi

if [ "$COMPILE" ]
then
    if [ ! `which yasm` ]
    then
        echo 'Yasm not found'
        if [ ! `which brew` ]
        then
            echo 'Homebrew not found. Trying to install...'
                        ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" \
                || exit 1
        fi
        echo 'Trying to install Yasm...'
        brew install yasm || exit 1
    fi
    if [ ! `which gas-preprocessor.pl` ]
    then
        echo '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 1
    fi

    if [ ! -r $SOURCE ]
    then
        echo 'FFmpeg source not found. Trying to download...'
        curl http://www.ffmpeg.org/releases/$SOURCE.tar.bz2 | tar xj \
            || exit 1
    fi

    CWD=`pwd`
    for ARCH in $ARCHS
    do
        echo "building $ARCH..."
        mkdir -p "$SCRATCH/$ARCH"
        cd "$SCRATCH/$ARCH"

        CFLAGS="-arch $ARCH"
        if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
        then
            PLATFORM="iPhoneSimulator"
            CFLAGS="$CFLAGS -mios-simulator-version-min=$DEPLOYMENT_TARGET"
        else
            PLATFORM="iPhoneOS"
            CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET -fembed-bitcode"
            if [ "$ARCH" = "arm64" ]
            then
                EXPORT="GASPP_FIX_XCODE5=1"
            fi
        fi

        XCRUN_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" ]
        then
            AS="gas-preprocessor.pl -arch aarch64 -- $CC"
        else
            AS="gas-preprocessor.pl -- $CC"
        fi

        CXXFLAGS="$CFLAGS"
        LDFLAGS="$CFLAGS"
        if [ "$X264" ]
        then
            CFLAGS="$CFLAGS -I$X264/include"
            LDFLAGS="$LDFLAGS -L$X264/lib"
        fi
        if [ "$FDK_AAC" ]
        then
            CFLAGS="$CFLAGS -I$FDK_AAC/include"
            LDFLAGS="$LDFLAGS -L$FDK_AAC/lib"
        fi

        TMPDIR=${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 1

        make -j5 install $EXPORT || exit 1
        cd $CWD
    done
fi

if [ "$LIPO" ]
then
    echo "building fat binaries..."
    mkdir -p $FAT/lib
    set - $ARCHS
    CWD=`pwd`
    cd $THIN/$1/lib
    for LIB in *.a
    do
        cd $CWD
        echo lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB 1>&2
        lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB || exit 1
    done

    cd $CWD
    cp -rf $THIN/$1/include $FAT
fi

echo Done

  4.5 根据架构进行编译,编译脚本(编译的裁剪版) 

    1)如果出现权限问题,执行命令

chmod 777 ./build-ffmpeg-simple.sh

    2)编译所有版本,执行脚本指令 

./build-ffmpeg-simple.sh

    编译所有版本,操作如下图: 

    编译所有版本,scratch 文件夹,如下图: 

    编译所有版本,thin 文件夹中头文件,如下图: 

    编译所有版本,thin 文件夹中静态库文件,如下图: 

    编译所有版本,FFmpeg-iOS 文件夹,如下图: 

    3)编译 arm64 架构版本,执行脚本指令 

./build-ffmpeg-simple.sh arm64

    4)编译 armv7 x86_64 i386 架构版本,执行脚本指令

./build-ffmpeg-simple.sh armv7 x86_64 i386

    5)lipo 合成库,指令

./build-ffmpeg-simple.sh lipo

    lipo 合成库,如把 arm64,x86_64 合并, 操作如图:

    lipo 合成库,如把 arm64,x86_64 合并, 合并到文件夹如图: 

5. 查看 .a 文件支持的内核架构指令: 

lipo -info FFmpeg-iOS/lib/libavcodec.a

  查询的结果:

lihanyang@MacBook-Pro FFmpeg % lipo -info FFmpeg-iOS/lib/libavcodec.a
Architectures in the fat file: FFmpeg-iOS/lib/libavcodec.a are: x86_64 arm64 


http://www.niftyadmin.cn/n/233686.html

相关文章

工厂模式概述

通常有三种形态: 简单工厂模式,不属于23种设计模式之一 工厂方法模式,是23种设计模式之一 抽象工厂模式,是23种设计模式之一 1.简单工厂模式是工厂模式的一种特殊实现,又被称为静态工厂方法模式 2.简单工厂模式解决的问题:客户端不…

pytorch 38 对tensorRT、openvino、onnxruntime推理速度进行对比

tensorRT与openvino部署模型有必要么?本博文对tensorRT、openvino、onnxruntime推理速度进行对比,分别在vgg16、resnet50、efficientnet_b1和cspdarknet53四个模型进行进行实验,对于openvino和onnxruntime还进行了cpu下的推理对比。通过实验得出:openvino GPU < onnxrun…

【OCR】CTC loss原理

1 CTC loss出现的背景 在图像文本识别、语言识别的应用中&#xff0c;所面临的一个问题是神经网络输出与ground truth的长度不一致&#xff0c;这样一来&#xff0c;loss就会很难计算&#xff0c;举个例子来讲&#xff0c;如果网络的输出是”-sst-aa-tt-e’, 而其ground truth…

如来十三掌(与佛论禅、Rot13编码)

下载附件打开是一串... 佛经 666 这个编码方式还真是第一次遇见----与佛论禅 对文本进行与佛论禅密码解密 得到 MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9 根据题目提示&#xff0c;如来十三掌&#xff0c;猜测是rot13加密&#xff0c;进行rot13解码 得到 Z…

第七天 CUDA Stream

CUDA Stream的理解 CUDA的程序一般需要处理海量的数据&#xff0c;内存带宽经常会成为主要的瓶颈 在Stream的帮助下&#xff0c;CUDA程序可以有效地将内存读取和数值运算并行&#xff0c;从而提升数据的吞吐量 由于GPU和CPU不能直接读取对方的内存&#xff0c;CUDA程序一般会…

C语言课设项目-51单片机-定时器和计数器

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、定时器的原理 1、CPU时序的有关知识 2、在学习定时器之前需要明白的 3、定时/计数器的工作原理 4、…

叶酸聚乙二醇羟基FA-PEG-OH;了解高分子试剂 Folate-PEG-OH

FA-PEG-OH&#xff0c;叶酸-聚乙二醇-羟基 中文名称&#xff1a;叶酸聚乙二醇羟基 英文名称&#xff1a;FA-PEG-OH HO-PEG-FA Folate-PEG-OH 性状&#xff1a;黄色液体或固体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水&#xff0c;DMSO、DMF等常规性有机溶剂 活性基…

python中__init__.py文件

例子 不要使用相对路径。 __init__.py# from net.functions import * VERSION "1.0.0"import os, sys module_path os.path.dirname(__file__) module_parent_path os.path.dirname(module_path) sys.path.extend([module_path, module_parent_path]) from net i…