我是靠谱客的博主 感动盼望,最近开发中收集的这篇文章主要介绍linux下ffmpeg编译成so文件,Mac 编译FFmpeg成一个SO库,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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库所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部