Mac下FFmpeg编译和集成

编译环境

  • macOS:10.13.6
  • Android NDK:16.1.4479499
  • FFmpeg:4.0.2

FFmpeg历史版本:www.ffmpeg.org/releases/

编译脚本

sh 复制代码
#!/bin/bash

# 配置自己的NDK路径
NDK_ROOT=/Users/sun/AndroidSDK/android-sdk-macosx/ndk/16.1.4479499

# NDK中交叉编译gcc所在目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

# gcc参数
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 -O0 -fPIC"
INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include"

# 定义编译后输出的目录
PREFIX=./android/arm32

# --enable-small 优化大小,必须优化才行
# --disable-programs 不编译ffmpeg程序(命令行工具),我们是需要获取静态、动态库
# --disable-avdevice 关闭avdevice模块,此模块在android中无用
# --disable-encoders 关闭所有编码器(播放不需要编码)
# --disable-muxers 关闭所有复用器(封装器),不需要生成mp4这样的文件,可以关闭
# --disable-filters 关闭所有滤镜
# --enable-cross-compile 开启交叉编译(ffmpeg是跨平台的)
# --cross-prefix 查找ndk的gcc
# --disable-shared 关闭动态库
# --enable-static 开启静态库
# --sysroot 寻找NDK所有的库文件
# --extra-cflags 会传给gcc的参数
# --arch 编译版本 v7a=arm; v8a=arm64;
# --target-os 目标系统

function build_android
{
echo "compile ffmpeg start..."

./configure \
--prefix=$PREFIX \
--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

make clean
make install

echo "compile ffmpeg end"

}

build_android

修改权限并执行脚本:

sh 复制代码
chmod 777 build32.sh
./build32.sh

编译成功后会在上面脚本里面prefix指定的目录下生成三个文件夹

  • include 头文件
  • lib 静态库
  • share 暂时不用

集成

导入到AS
编写CMakeLists.txt
cmake 复制代码
cmake_minimum_required(VERSION 3.4.1)

add_library(
      xplayer
      SHARED
      x-player.cpp)

# 引入FFmpeg头文件
include_directories(${CMAKE_SOURCE_DIR}/ffmpeg/include)

# 引入FFmpeg库文件
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/ffmpeg/${CMAKE_ANDROID_ARCH_ABI}")

find_library(
      log-lib
      log)

# 链接到总库 xplayer.so
target_link_libraries(
      xplayer
       # 需要保持这个顺序(忽略顺序可以使用 -Wl,--start-group -Wl,--end-group)
      avformat avcodec avfilter avutil swresample swscale
       ${log-lib})
测试代码
cpp 复制代码
#include <jni.h>
#include <string>

extern "C" {
   #include "libavutil/avutil.h"
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_sun_xplayer_MainActivity_getVersion(JNIEnv *env, jobject thiz) {
   std::string version = "ffmpeg version: ";
   //获取FFmpeg版本号
   version.append(av_version_info());
   return env->NewStringUTF(version.c_str());
}
kotlin 复制代码
 init {
       System.loadLibrary("xplayer")
  }

   external fun getVersion():String
   
   fun printFFmpegVersion() {
       Log.d("XPlayer", getVersion())
       //ffmpeg version: 4.0.2
  }

成功打印说明OK了

相关推荐
氦客1 小时前
Android Compose : 传统View在Compose组件中的等价物
android·compose·jetpack·对比·传统view·等价物·compose组件
神话20092 小时前
Rust 初体验与快速上手指南
android·rust
CheungChunChiu2 小时前
Linux 内核动态打印机制详解
android·linux·服务器·前端·ubuntu
aidou13143 小时前
Android中设置Dialog和自定义布局相同高度
android·dialog·弹窗高度·getwindow
氦客4 小时前
UI编程的发展史 : 结合命令式UI和声明式UI
android·compose·声明式ui·ui编程·命令式ui·ui编程发展史·标记语言
aidou13146 小时前
Android中RecyclerView实现多级列表
android·recyclerview·多级列表·layoutmanager
青风行6 小时前
Android从入门到进阶
android
方白羽6 小时前
Android 开发中,准确判断应用处于“前台(Foreground)”还是“后台(Background)
android·app·客户端
Mart!nHu7 小时前
Android 10&15 Framework 允许设置系统时间早于编译时间
android
编程之路从0到18 小时前
ReactNative新架构之Android端TurboModule机制完全解析
android·react native·源码阅读