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了

相关推荐
启雀AI14 小时前
培训平台移动端离线学习方案设计与实现:视频缓存、断点续传与进度同步的工程实践
android·学习·缓存·音视频·企业lms
我命由我1234515 小时前
RxJava - 冷数据流与热数据流
android·java·java-ee·android studio·rxjava·android-studio·android runtime
2601_9665635217 小时前
愤怒的小鸟单机版 去广告 安卓+PC端离线纯净版 益智耐玩小游戏 不需联网 老旧手机都可以玩 怀旧手机小游戏
android·智能手机
hunterandroid17 小时前
[Android 从零到一] Retrofit 请求取消与生命周期绑定:从 Call.cancel 到协程可取消设计
android
爱跑马的程序员17 小时前
安卓专有的通信子系统-Binder IPC
android·binder·ipc·安卓间通信机制
ue星空18 小时前
【安卓逆向】为什么用Frida?
android
小驰行动派18 小时前
Camx架构全景图:从V4L2到Pipeline的完整拆解
android·camera·android camera
hunterandroid19 小时前
[Android 从零到一] Custom View 触摸反馈与手势冲突解决
android
coderSong256820 小时前
Android | 四大组件之 BroadcastReceiver(广播接收器)
android
爱笑鱼1 天前
Android 系统启动机制(二):init.rc 不是普通脚本,service、action 和 property 怎样驱动启动?
android