欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mac环境用Shell脚本编译最新版ffmpeg-4.2.1

程序员文章站 2022-04-07 14:30:45
...

FFmpeg简介

FFmpeg全名是Fast Forward MPEG(Moving Picture Experts Group),FFmpeg官网。“FFmpeg"中"FF"指的是"Fast Forward”,"mpeg"指的是一种压缩率比较大的活动图像和声音的压缩标准。

  • FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序
  • FFmpeg是一个多媒体视频处理工具,有非常强大的功能,包括视频采集功能、视频格式转换、视频抓图、给视频加水印等
  • FFmpeg是一套开源免费跨平台的多媒体框架。它提供了录制、转换以及流化音视频的完整解决方案,目前bilibili、抖音、爱奇艺等视频播放都是基于FFmpeg

FFmpeg组成部分

FFmpeg工具

  1. FFmpeg
  2. FFplay
  3. FFprobe

FFmpeg开发库

  1. Libavcodec(分析码流提供独立的音频或视频码流源)
  2. Libavutil (包含一些公共的工具函数的使用库,包括算术运算、字符操作等)
  3. Libavformat (用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能。音视频的格式解析协议,为libavcodec 分析码流提供独立的音频或视频码流源。)
  4. Libavdevice(硬件采集、加速、显示。操作计算机中常见的音视频捕获或输出设备有ALSA、AUDIO_BEOS、JACK、OSS、1394、VFW等)
  5. Libavfilter(filter(FileIO、FPS、DrawText)音视频滤波器的开发,如宽高比、裁剪、格式化、非格式化、伸缩等)
  6. Libswscale(原始视频格式转换,用于食品场景比例缩放、色彩映射转换、图像颜色空间或格式转换,如RGB565、RGB888等与YUV420等之间的转换)
  7. Libswresample(原始音频格式转码)

使用FFmpeg

  • FFmpeg是由C代码编写而成,功能多,代码量大
  • 在Android平台使用需要先编译,后使用,编译可以通过MakeFile语法进行编译

FFmpeg编译流程

FFmpeg下载:http://ffmpeg.org/download.html
ndk下载:https://developer.android.google.cn/ndk/downloads

我这里下载的ndk-r17c,ffmpef-4.2.1

下载成功后解压下

解压ndk

unzip android-ndk-r17c-linux-x86_64.zip

解压FFmpeg

tar -xjvf ffmpeg-4.2.1.tar.bz2
Mac环境用Shell脚本编译最新版ffmpeg-4.2.1

注意要配置下ndk的环境变量(比较简单,读者自行配置)

打开终端进入到ffmpeg目录
Mac环境用Shell脚本编译最新版ffmpeg-4.2.1
可以看到其中有个configure文件,configure文件其实是一个shell脚本,用于生成MakeFile文件,然后可以使用make命令执行。在ffmpeg-4.2.1中默认使用clang编译,我使用gcc编译,所以要关闭clang编译

vim configure

在命令模式下输入 set number 打开行号指示器,注释掉4210行到4213行

Mac环境用Shell脚本编译最新版ffmpeg-4.2.1

接着我们来写个share脚本编译ffmpeg

vim build_android.sh

build_android.sh内容如下,读者可以copy内容修改下ndk路径和ffmpeg配置参数,注意TOOLCHAIN的路径配置,mac环境和linux环境配置的路径是不一样的,linux是:$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

#!/bin/bash
#这里定义变量,后续会使用
#NDK_ROOT ndk所在路径**需要携程自己电脑的ndk路径**
NDK_ROOT=/Users/jokerwan/StudySourceCode/android-ndk-r17c

#TOOLCHAIN 变量指向ndk中的交叉编译gcc所在的目录,ndk版本:android-ndk-r17c-darwin-x86_64
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

#FLAGS与INCLUDES变量 可以从AS ndk工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷贝,需要注意的是**地址**
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11  -O0 -fPIC"

INCLUDES="-isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++/include -isystem $NDK_ROOT/sources/android/support/include -isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include"

#此变量用于编译完成之后的库与头文件存放在哪个目录
PREFIX=./android/armeabi-v7a

#执行configure脚本,用于生成makefile
#--prefix : 安装目录
#--enable-small : 优化大小
#--disable-programs : 不编译ffmpeg程序(命令行工具),我们是需要获得静态(动态)库。
#--disable-avdevice : 关闭avdevice模块,此模块在android中无用
#--disable-encoders : 关闭所有编码器 (播放不需要编码)
#--disable-muxers :  关闭所有复用器(封装器),不需要生成mp4这样的文件,所以关闭
#--disable-filters :关闭视频滤镜
#--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 )
#--cross-prefix: 看右边的值应该就知道是干嘛的,gcc的前缀 xxx/xxx/xxx-gcc 则给xxx/xxx/xxx-
#disable-shared enable-static 不写也可以,默认就是这样的。
#--sysroot: 
#--extra-cflags: 会传给gcc的参数
#--arch --target-os : 不给不行,为什么给这些值,见视频
./configure \
--prefix=$PREFIX \
--extra-cflags="-U_FILE_OFFSET_BITS" \
--extra-libs=-lgcc \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--disable-shared \
--enable-static \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDK_ROOT/sysroot" \
--arch=arm \
--target-os=android 

#上面运行脚本生成makefile之后,使用make执行脚本
make clean
make install

接着修改build_android.sh权限

chmod 777 build_android.sh

然后执行build_android.sh开始编译,mac编译比较快,我编译大概花了2分钟

sh build_android.sh

然后再ffmpeg-4.2.1目录下生成一个android文件夹
Mac环境用Shell脚本编译最新版ffmpeg-4.2.1
android文件夹目录结构如下:
Mac环境用Shell脚本编译最新版ffmpeg-4.2.1

  • include: 存放头文件
  • lib: 存放静态库
  • share: 存放示例c代码