目录

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了

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
stevenzqzq4 小时前
android中dp和px的关系
android
一一Null6 小时前
Token安全存储的几种方式
android·java·安全·android studio
JarvanMo7 小时前
flutter工程化之动态配置
android·flutter·ios
时光少年9 小时前
Android 副屏录制方案
android·前端
时光少年9 小时前
Android 局域网NIO案例实践
android·前端
alexhilton10 小时前
Jetpack Compose的性能优化建议
android·kotlin·android jetpack
流浪汉kylin10 小时前
Android TextView SpannableString 如何插入自定义View
android
火柴就是我11 小时前
git rebase -i,执行 squash 操作 进行提交合并
android
你说你说你来说12 小时前
安卓广播接收器(Broadcast Receiver)的介绍与使用
android·笔记
你说你说你来说12 小时前
安卓Content Provider介绍及使用
android·笔记