1.下载ffmpeg

#!/bin/bash

source="ffmpeg-4.1"

if [ ! -r $source ]

then

curl http://ffmpeg.org/releases/${source}.tar.bz2 | tar xj || exit 1

fi

curl 表示下载,后边跟下载的地址。

tar表示解压或者压缩。 x表示解压,j表示是否需要解压bz2压缩包(压缩包格式类型有很多:zip、bz2等等)

2.查看ffmpeg编译配置项

cd 到ffmpeg目录下,

执行./configure --help

ffmpeg有很多配置项:

help options:帮助选项、

standard options:标准选项、

Licensing options:许可选项、

configuration options:配置选项、

external library support:外部库支持、

toolchain options:工具链选项、

advanced options:高级选项、

developer options:开发者选项、

3.编译ffmpeg

下边分析:

1.定义一些字符串

VERSION="4.1" //版本号

SOURCE="ffmpeg-$VERSION" // 需要编译的ffmpeg源文件

CACHEDIR="CACHEDIR" // 保存编译生成的.o文件。

STATICDIR=`pwd`/"weixiao-ffmpeg" // 编译生成的静态库.a的目录

pwd表示获取当前位置的命令。

2.添加ffmpeg的配置项

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

FFmpeg一共九个库,常用的(默认)编译的是七个库。 而我们一般用到的是3到4个库,其中最重要的库是用于编解码的库avcodec。

可以根据我们的需要进行编译:

查看这些配置项使用上边第二条讲过的方式,./confifure --help

通过设置CONFIGURE_FLAGS 来配置这些库是否需要,类似下边:

CONFIGURE_FLAGS ="$CONFIGURE_FLAGS --enable-avdevice --enable-avcodec --enable-avformat --disable-postproc"

3.添加需要编译的cpu平台

ARCHS="arm64 armv7 x86_64 i386"

// 也可以动态的通过入参指定需要的cpu平台

if [ "$*" ]

then

#存入输入参数,也就说:外部指定需要编译CPU架构类型

ARCHS ="$*"

fi

4.安装汇编器yasm

if [ ! `which yasm` ]

then

echo "Yasm not found"

if [ ! `which brew` ]

then

echo "Homebrew not found"

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" || exit 1

fi

brew install yasm || exit 1

fi

ffmpeg编译用到了汇编,所以需要汇编器yasm,注意不要写错。

5.gas-preprocessor.pl 脚本文件

if [ ! `which gas-preprocessor.pl` ]

then

echo "gas-preprocessor.pl not found"

(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

ffmpeg编译需要gas-preprocessor.pl 文件,它是一个perl的脚本。

6.根据需要的cpu平台循环编译

CWD=`pwd`

for ARCH in $ARCHS

do

编译代码

done

7.for循环中的代码一,首先设置platform平台(7和下边都是for遵循中执行的代码)

echo "build $ARCH"

mkdir -p "$CACHEDIR/$ARCH"

cd "$CACHEDIR/$ARCH"

CFLAGS="-arch $ARCH"

if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]

then

PLATFORM="iPhoneSimulator"

CFLAGS="$CFLAGS -mios-simulator-version-min=$TARGET"

else

PLATFORM="iPhoneOS"

CFLAGS="$CFLAGS -mios-version-min=$TARGET -fembed-bitcode"

if [ "$ARCH" = "arm64" ]

then

EXPORT="GASPP_FIX_XCODE5=1"

fi

fi

根据需要编译的cpu类型,设置 PLATFORM 是真机还是模拟器。

设置了编译参数 CFLAGS,支持的最低iOS版本。

是否支持x264 和 acc

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

根据是否支持x264 和acc 继续拼接编译参数。

设置汇编器

XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`

CC="xcrun -sdk $XCRUN_SDK clang"

if [ "$ARCH" = "arm64" ]

then

AS="gas-preprocessor.pl -arch aarch64 -- $CC"

else

AS="gas-preprocessor.pl -- $CC"

fi

设置了汇编参数 cc 和as

10.设置参数,并编译

TMPDIR=${TMPDIR/%\/} $CWD/$SOURCE/configure \

--target-os=darwin \

--arch=$ARCH \

--cc="$CC" \

--as="$AS" \

$CONFIGURE_FLAGS \

--extra-cflags="$CFLAGS" \

--extra-ldflags="$LDFLAGS" \

--prefix="$STATICDIR/$ARCH" \

|| exit 1

make -j3 install $EXPORT || exit 1

cd $CWD

--prefix表示.a文件的输出文件目录

darwin 是Mac系统的意思

4.编译ffmpeg遇到的问题汇总:

1.shell脚本的语法错误,`` 写成了 '' ,斜着的两个点表示shell命令,竖直的两点表示字符串的意思。

`pwd` 表示获取当前位置的命令, 'pwd'表示pwd字符串

2.shell脚本错误,=号和if判断

name="jack" =号前不能有空格

if [ age == 18 ] []前后必须有空格

3.变量名和专有名词写错

ffmpeg 需要的汇编器是 yasm 而不是ysam。 因为变量名写的时候不报错,所以很难检查出来,要细心些。

4.编译错误,我编译的时候遇到了如下错误:

xcrun -sdk iphoneos clang is unable to create an executable file.

C compiler test failed.

解决方案是命令行执行如下语句:

sudo xcode-select --switch /Applications/Xcode.app

该问题的链接为:issues119 大意是说因为找不到Xcode的目录。

5.完整脚本如下:

VERSION="4.1"

SOURCE="ffmpeg-$VERSION"

CACHEDIR="CACHEDIR"

STATICDIR=`pwd`/"weixiao-ffmpeg"

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

ARCHS="arm64 armv7 x86_64 i386"

TARGET="10.0"

if [ ! `which yasm` ]

then

echo "Yasm not found"

if [ ! `which brew` ]

then

echo "Homebrew not found"

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" || exit 1

fi

brew install yasm || exit 1

fi

if [ ! `which gas-preprocessor.pl` ]

then

echo "gas-preprocessor.pl not found"

(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

CWD=`pwd`

for ARCH in $ARCHS

do

echo "build $ARCH"

mkdir -p "$CACHEDIR/$ARCH"

cd "$CACHEDIR/$ARCH"

CFLAGS="-arch $ARCH"

if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]

then

PLATFORM="iPhoneSimulator"

CFLAGS="$CFLAGS -mios-simulator-version-min=$TARGET"

else

PLATFORM="iPhoneOS"

CFLAGS="$CFLAGS -mios-version-min=$TARGET -fembed-bitcode"

if [ "$ARCH" = "arm64" ]

then

EXPORT="GASPP_FIX_XCODE5=1"

fi

fi

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

XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`

CC="xcrun -sdk $XCRUN_SDK clang"

if [ "$ARCH" = "arm64" ]

then

AS="gas-preprocessor.pl -arch aarch64 -- $CC"

else

AS="gas-preprocessor.pl -- $CC"

fi

TMPDIR=${TMPDIR/%\/} $CWD/$SOURCE/configure \

--target-os=darwin \

--arch=$ARCH \

--cc="$CC" \

--as="$AS" \

$CONFIGURE_FLAGS \

--extra-cflags="$CFLAGS" \

--extra-ldflags="$LDFLAGS" \

--prefix="$STATICDIR/$ARCH" \

|| exit 1

make -j3 install $EXPORT || exit 1

cd $CWD

done

ffmpeg库编译加文字_1.编译ffmpeg库相关推荐

  1. ffmpeg库编译加文字_使用ffmpeg库编译错误及解决办法

    一.FFmpeg源代码下载与编译 # wget http://www.ffmpeg.org/releases/ffmpeg-0.5.13.tar.bz2 # tar -jxvf ffmpeg-0.5. ...

  2. ffmpeg库编译加文字_我自己的FFMpeg编译之路

    为了编译这个东西,快折腾了一个星期了.期间经历了很多痛苦的过程,今天我把整个过程,以及在这个过程的感悟写下来,以备日后查看,也希望能帮到一些像我一样的兄弟姐妹. 在这一个星期里前前后后加起来总共使用了 ...

  3. ffmpeg库编译加文字_ffmpeg第三方库编译记录

    最近在研究ffmpeg的编译,之前使用的Ubuntu,需要安装虚拟机,非常麻烦,所以后来改研究在Windows平台编译. 一开始遇到很多挫折,参考了网上很多的帖子,但要么不全要么内容已过期,经过我的反 ...

  4. ffmpeg 给 视频 加 文字 水印 标识 阴影 设置 颜色 字体 大小 懒人系列 28 centos7 linux

    centos7 linux ffmpeg shell 懒 0.给 视频 加 文字 水印 标识 阴影 设置 颜色 字体 大小 1.建立个文本,改个扩展名shell.sh,复制下面代码-保存. 打开终端( ...

  5. php 给视频添加水印,记php调用ffmpeg给视频加文字水印

    ffmpeg做程序的应该很多人都知道,我自己平时用的potplayer据说因为使用了它的代码而不开源被挂上了耻辱柱,前些日子接触到了给视频加水印的需求,大致是要用php使用命令行来执行ffmpeg程序 ...

  6. ffmpeg 添加视频加文字水印--drawtext 滤镜详解

    使用ffmpeg 命令行给视频添加文字水印,利用drawtext滤镜,如果是代码上api调用,也是一样的用法,创建好滤镜图, 在滤镜图描述字符串中,把这里命令行的参数拷贝过去替换就行,改动非常方便. ...

  7. php 图片上加文字,php使用GD库实现图片上添加文字的方法(代码)

    本篇文章给大家带来的内容是关于php使用GD库实现图片上添加文字的方法(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我们可以利用php的gd库扩展来对我们的图片进行处理,例 ...

  8. vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)

    vc++编译时运行库选择(/MT/MTd/MD/MDd) vc++编译时运行库选择(/MT./MTd./MD./MDd) 在vs中,项目属性 ->C/C++ ->代码生成 ->运行库 ...

  9. iphone静态库的加载和调试

    一. iphone静态库的加载:使用静态库需要提供*.a库文件和*.h头文件. 1. 在xcode中Frameworks项上点击右键add->existing files选择*.a库文件 2. ...

最新文章

  1. 腾讯天衍实验室夺世界机器人大赛双冠军,新算法突破脑机接口瓶颈
  2. 一份超级全面的PHP面试题
  3. mysql group by 规则_mysql 的group by 满足的规则要求:
  4. mysql sql running no_【MySql】复制出现Slave_SQL_Running: No 错误解决
  5. Springmvc 关于静态资源转发的问题解决
  6. python变量类型字符串的内建函数使用
  7. python上下文管理关键字_理解 Python 的上下文管理器
  8. 判断鼠标向右或向左滑动,响应不同的事件
  9. Linux Patch 文件代码补丁
  10. 数据库事务的四大特性和隔离级别,一文带你看通透
  11. 解题:POI 2009 Lyz
  12. 腾讯云拟年内在全球增设超30%数据中心;Zepp Health首季成人智能手表出货量居全球前四 | 全球TMT...
  13. 再论关于如何学习网络编程
  14. 龙ol服务器维护补偿boss,BOSS也疯狂《龙OL》野外BOSS大搜罗
  15. 分享申请IDP账号的过程,包含duns申请的分享
  16. python-flask-制作网页入门1
  17. 闲人闲谈PS之十一——WBS-BOM的用法
  18. 一图读懂JVM架构解析
  19. 配置Linux版本teamviewer
  20. 一个人的垃圾就是另一个人的Linux计算机

热门文章

  1. DotNet Core 介绍
  2. 【数据库原理及应用】经典题库附答案(14章全)——第九章:数据库安全性
  3. C语言试题六十九之请编写函数判断一个数是不是素数
  4. C语言试题四十之使字符串中尾部的*号不得多于n个;若多于n个,则删除多于的*号;若少于或等于n个,则什么也不做,字符串中间和前面的*号不删除。
  5. C/C++之内存对齐
  6. 如何隐藏地址栏中的真实地址_Firefox推出Private Relay插件:可隐藏真实邮箱地址...
  7. php gearmanclient addoptions,gearman PHP7扩展安装
  8. java 字节序列_java – 这个线程安全的字节序列生成器有什么问题?
  9. android编程绘图,Android编程绘图操作之弧形绘制方法示例
  10. 不作死就不会死,盘点那些死于自己发明的发明家