Android编译ffmpeg

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

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

创建ffmpeg文件夹

mkdir ffmpeg
cd 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-r15b
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export 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_FLAG
make clean
make
make 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\lib
find_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} )

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值