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了

相关推荐
居安思危_Ho17 小时前
RK平台Uniapp自启动缓存问题解决
android·缓存·uni-app·rk平台·uniapp资源文件
molong93118 小时前
Activity/Service/Broadcast/ContentProvider 生命周期交互
android·学习·交互
molong93120 小时前
Android 权限模型(前台、后台、特殊权限)
android
怪兽201421 小时前
Looper、MessageQueue、Message及Handler的关系是什么?如何保证MessageQueue的并发访问安全?
android·面试
奥尔特星云大使21 小时前
mysql高可用架构之MHA部署(二)VIP漂移(保姆级)
android·mysql·架构·mha·ip漂移
深海呐1 天前
Android 编译速度优化:JVM堆内存扩充
android·jvm·jvm内存扩充·android 加快编译速度
心随雨下1 天前
Flutter中新手需要掌握的几种Widget
android·flutter·ios
叶辞树1 天前
查看安卓设备的音视频解码器信息
android
f30517091 天前
Python实现数据可视化用Matplotlib轻松创建专业级图表
android