概述
FFmpeg使用第三步,编译FFmpeg成一个SO库.
编译环境macOS High Sierri 10.13.3
android-ndk-r14b
FFmpeg 3.4.2
简介
由于ffmpeg编译的so数目繁多,直接使用这些类库还是比较麻烦的. 因此可以将它们合并为一个类库 libffmpeg.so .
操作步骤与编译多个so的脚本不同,这个脚本不再需要修改Configure的内容(生成的是.a而不是.so,并没有涉及到版本号问题)
编译多个so的脚本里面Configure的时候是“–enable-shared –disable-static”,这个脚本里面Configure的时候设置的是“–enable-static –disable-shared”。编译完成后生成的是:libavcodec.a
libavfilter.a
libswresample.a
libavformat.a
libavutil.a
libswscale.a
该脚本运行完后,会把上述的*.a文件打包为一个so文件:libffmpeg.so
合并后的类库使用起来和合并前的类库使用方法没有区别。
修改后的脚本文件为:
build_android.sh
#!/bin/bash
PLATFORM=/Users/lake/test/android-ndk-r14b/platforms/android-19/arch-arm/
TOOLCHAIN=/Users/lake/test/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
PREFIX=./android
function build_one
{
./configure
--prefix=$PREFIX
--target-os=android
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-
--arch=arm
--sysroot=$PLATFORM
--extra-cflags="-I$PLATFORM/usr/include"
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm
--disable-shared
--disable-ffmpeg
--disable-ffplay
--disable-ffprobe
--disable-ffserver
--disable-doc
--disable-symver
--enable-small
--enable-gpl
--enable-asm
--enable-jni
--enable-mediacodec
--enable-decoder=h264_mediacodec
--enable-hwaccel=h264_mediacodec
--enable-decoder=hevc_mediacodec
--enable-decoder=mpeg4_mediacodec
--enable-decoder=vp8_mediacodec
--enable-decoder=vp9_mediacodec
--enable-nonfree
--enable-version3
--extra-cflags="-Os -fpic$ADDI_CFLAGS"
--extra-ldflags="$ADDI_LDFLAGS"
$ADDITIONAL_CONFIGURE_FLAG
make clean
make j8
make install
$TOOLCHAIN/bin/arm-linux-androideabi-ld
-rpath-link=$PLATFORM/usr/lib
-L$PLATFORM/usr/lib
-L$PREFIX/lib
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o
$PREFIX/libffmpeg.so
libavcodec/libavcodec.a
libavfilter/libavfilter.a
libswresample/libswresample.a
libavformat/libavformat.a
libavutil/libavutil.a
libswscale/libswscale.a
libavdevice/libavdevice.a
libpostproc/libpostproc.a
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
}
# arm v7vfp
CPU=arm
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
ADDI_CFLAGS="-marm"
build_one
执行build_android.sh:
1在ffmpeg源码根目录下建完buid_android.sh脚本后,先在ffmpeg源码的父目录下执行 chmod -R 777 ./ffmpeg-3.4.2,给予读写权限。
1然后到ffmpeg目录下执行脚本 ./build_android.sh
等待一会,编译成功以后就可以看到单个库版的FFmpeg了.
在 ffmpeg/android 目录下就能找到编译好的文件:
测试单个库版的FFmpegAndroid.mk文件
LOCAL_PATH := $(call my-dir)
# FFmpeg library
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := libffmpeg.so
include $(PREBUILT_SHARED_LIBRARY)
# Program
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpegdemo
LOCAL_SRC_FILES := ffmpegdemo.c
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_LDLIBS := -llog -lz
LOCAL_SHARED_LIBRARIES := ffmpeg
include $(BUILD_SHARED_LIBRARY)MainActivity.java 加载SO库的代码
static {
System.loadLibrary("ffmpeg");
System.loadLibrary("ffmpegdemo");
}
CMake方式
#CMake版本信息
cmake_minimum_required(VERSION 3.4.1)
#ffmpeg so文件路径
set(lib_src_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})
#配置加载native依赖
include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)
#动态方式加载ffmepg的so文件 第三方库加载方式
add_library(ffmpeg SHARED IMPORTED)
#引入libffmpeg.so文件
set_target_properties(ffmpeg PROPERTIES IMPORTED_LOCATION${lib_src_DIR}/libffmpeg.so)
#CPP文件夹下待编译的c文件
add_library(native-lib SHARED ${CMAKE_SOURCE_DIR}/src/main/cpp/native-lib.cpp)
#C 日志 ndk官方库find_library(log-lib log)
#静态库与动态库进行链接 相当于gcc命令行参数 -l。
target_link_libraries(native-lib
android
ffmpeg
${log-lib})MainActivity.java 加载SO库的代码
static {
System.loadLibrary("ffmpeg");
System.loadLibrary("native-lib");
}
现在就可以运行了.
最后
以上就是感动盼望为你收集整理的linux下ffmpeg编译成so文件,Mac 编译FFmpeg成一个SO库的全部内容,希望文章能够帮你解决linux下ffmpeg编译成so文件,Mac 编译FFmpeg成一个SO库所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复