Android编译ffmpeg

来源:互联网 发布:fast迅捷网络fwr200 编辑:程序博客网 时间:2024/05/16 13:39

DEMO:https://github.com/zhaopingfu/FFmpegDemo

ffmpeg下载地址:https://ffmpeg.org/releases/

创建ffmpeg文件夹

mkdir ffmpegcd ffmpeg

下载ffmpeg

wget http://ffmpeg.org/releases/ffmpeg-2.6.9.tar.gz

解压

tar -xzf ffmpeg-2.6.9.tar.gz

给权限

chmod 777 -R ffmpeg-2.6.9

进入ffmpeg-2.6.9里面,创建build_android.sh,在里面写入配置

#!/bin/bash#注意下面这几个,把路径修改为自己的export NDK=/usr/ndk/android-ndk-r15bexport SYSROOT=$NDK/platforms/android-9/arch-arm/export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64export CPU=armexport PREFIX=$(pwd)/android/$CPUexport ADDI_CFLAGS="-marm"./configure --target-os=linux \--prefix=$PREFIX --arch=arm \--disable-doc \--enable-shared \--disable-static \--disable-yasm \--disable-symver \--enable-gpl \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-ffserver \--disable-doc \--disable-symver \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--enable-cross-compile \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS" \$ADDITIONAL_CONFIGURE_FLAGmake cleanmakemake install

执行build_android.sh

./build_android.sh

发现问题

编译后会在当前路径下生成/android/arm/lib和/android/arm/include
但是在lib中生成的so库文件的名字有点不太对,是libavdevice.so.56
我们想要的是libavdevice-56.so
所以
cd ../../../

解决问题

在ffmpeg里找到configure文件,编辑configure文件

在2779行修改

#把原来的命名规则注掉#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'#LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'#zhaopf 修改生成的so库的命名规则                                        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'SLIB_INSTALL_LINKS='$(SLIBNAME)'

这样在当前目录下会生成一个android文件加,里面的lib下有想要的.so库

这里写图片描述

在AndroidStudio中配置

app下的build.gradle中

defaultConfig {    applicationId "com.pf.ffmpegdemo"    minSdkVersion 15    targetSdkVersion 25    versionCode 1    versionName "1.0"    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"    sourceSets{        main{            jniLibs.srcDirs = ['libs']        }    }    externalNativeBuild {        cmake {            cppFlags "-frtti -fexceptions"            abiFilters 'armeabi'        }    }}externalNativeBuild {    cmake {        path "CMakeLists.txt"    }}

CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)#寻找SDK中自带的库#路径:\SDK\ndk-bundle\platforms\android-23\arch-arm\usr\libfind_library( log-lib              log )#设置变量set(DIR ../../../../libs)add_library(avcodec-56            SHARED            IMPORTED)set_target_properties( avcodec-56                       PROPERTIES IMPORTED_LOCATION                       ${DIR}/armeabi/libavcodec-56.so)add_library(avdevice-56            SHARED            IMPORTED)set_target_properties( avdevice-56                       PROPERTIES IMPORTED_LOCATION                       ${DIR}/armeabi/libavdevice-56.so)add_library(avfilter-5            SHARED            IMPORTED)set_target_properties( avfilter-5                       PROPERTIES IMPORTED_LOCATION                       ${DIR}/armeabi/libavfilter-5.so)add_library(avformat-56            SHARED            IMPORTED)set_target_properties( avformat-56                       PROPERTIES IMPORTED_LOCATION                       ${DIR}/armeabi/libavformat-56.so)add_library(avutil-54            SHARED            IMPORTED)set_target_properties( avutil-54                       PROPERTIES IMPORTED_LOCATION                       ${DIR}/armeabi/libavutil-54.so)add_library(postproc-53            SHARED            IMPORTED)set_target_properties( postproc-53                       PROPERTIES IMPORTED_LOCATION                       ${DIR}/armeabi/libpostproc-53.so)add_library(swresample-1            SHARED            IMPORTED)set_target_properties( swresample-1                       PROPERTIES IMPORTED_LOCATION                       ${DIR}/armeabi/libswresample-1.so)add_library(swscale-3            SHARED            IMPORTED)set_target_properties( swscale-3                       PROPERTIES IMPORTED_LOCATION                       ${DIR}/armeabi/libswscale-3.so)#引入include下的头文件include_directories(libs/include)#include_directories(src/main/cpp/include)#引入自己的库add_library( native-lib             SHARED             src/main/cpp/native-lib.cpp )#链接的目标库target_link_libraries( native-lib                       avcodec-56                       avdevice-56                       avfilter-5                       avformat-56                       avutil-54                       postproc-53                       swresample-1                       swscale-3                       ${log-lib} )

这样就可以了,编译可以通过