使用FFmpeg动态库

参考1:http://blog.csdn.net/u011512437/article/details/50290765

参考2:http://blog.csdn.net/vincent_blog/article/details/7874136 在Application.mk里指定

APP_ABI :=armeabi
兼容X86平台下产生的SO文件


其他异常:http://blog.csdn.net/mapboo/article/details/48790183


使用FFmpeg动态库

本文借鉴最简单的基于FFmpeg的移动端例子:Android HelloWorld,并介绍在Android Studio中的实现。
项目地址:https://github.com/Getnway/FFmpegDemo
本文介绍的是用NDK编译动态库,并在Android Studio中调用的步骤。

准备

项目需要有FFmpeg的动态库,如下文件(版本可以不同)。
FFmpeg动态库编译参考Linux下编译FFmpeg


开始

  1. 在新建项目的MainActivity中,写入本地方法声明和载入动态库代码。详细代码可查看项目仓库

    //声明函数
    public native String urlprotocolinfo();
    public native String avformatinfo();
    public native String avcodecinfo();
    public native String avfilterinfo();
    public native String configurationinfo();
    
    //载入动态库
    static {
        System.loadLibrary("avcodec-57");
        System.loadLibrary("avdevice-57");
        System.loadLibrary("avfilter-6");
        System.loadLibrary("avformat-57");
        System.loadLibrary("avutil-55");
        System.loadLibrary("postproc-54");
        System.loadLibrary("swresample-2");
        System.loadLibrary("swscale-4");
        System.loadLibrary("ffmpegdemo");   //即Android.mk文件#Program下的LOCAL_MODULE
    }
    
  2. 打开Android Studio的Terminal,并执行以下命令生成JNI头文件(.h)。注意修改路径。命令参数意义参考Android Studio中使用NDK

    javah -d jni -classpath E:\Android\AndroidStudioSDK\platforms\android-19\android.jar;‪‪E:\Android\AndroidStudioSDK\extras\android\support\v4\android-support-v4.jar;E:\Android\AndroidStudioSDK\extras\android\support\v7\appcompat\libs\android-support-v4.jar;E:\Android\AndroidStudioSDK\extras\android\support\v7\appcompat\libs\android-support-v7-appcompat.jar;..\..\build\intermediates\classes\debug com.example.l1.ffmpegdemo.MainActivity
    

    执行完后,项目会在app\src\main下新增一个jni文件夹
    jni文件夹中增加源代码(.c)文件,详细代码请查看项目仓库
    再将准备好的FFmpeg动态库加入到项目的jni文件夹,并增加编译文件Android.mk
    最后项目变成这样:

    继续在Terminal中执行NDK的ndk-build生成动态库。(ndk-build所在文件夹,即NDK目录如果没有加入环境变量则需要绝对路径)
    所有执行的命令如下:

    执行完ndk-build后项目将在app\src\mian下,产生两个新的文件夹libsobjlibs中产生的动态库就是我们需要的。

  3. 在module的build.gradle文件(在app文件夹)中的android {}内指定动态库路径就可以顺利调用FFmpeg动态库了。

    //指定动态库路径
    sourceSets{
        main{
            jni.srcDirs = []
            jniLibs.srcDir 'src/main/libs'
        }
    }
    

使用编译脚本

是不是每次修改了源文件(.c)都要在Terminal中执行ndk-build编译出动态库(.so),然后再编译运行App这么麻烦呢?当然不是!我们可以使用编译脚本,只要将module的build.gradle文件(在app文件夹)修改为下面的形式,我们就可以在每次修改源文件(.c)后,直接点击运行(绿色的三角)就可以重新编译动态库并运行啦!!!

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.l1.ffmpegdemo"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"

    }

    //指定动态库路径
    sourceSets{
        main{
            jni.srcDirs = []    // disable automatic ndk-build call, which ignore our Android.mk
            jniLibs.srcDir 'src/main/libs'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {
        workingDir file('src/main')
        commandLine getNdkBuildCmd()
        //commandLine 'E:/Android/android-ndk-r10e/ndk-build.cmd'   //也可以直接使用绝对路径
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }

    task cleanNative(type: Exec) {
        workingDir file('src/main')
        commandLine getNdkBuildCmd(), 'clean'
    }

    clean.dependsOn cleanNative
}

//获取NDK目录路径
def getNdkDir() {
    if (System.env.ANDROID_NDK_ROOT != null)
        return System.env.ANDROID_NDK_ROOT

    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    def ndkdir = properties.getProperty('ndk.dir', null)
    if (ndkdir == null)
        throw new GradleException("NDK location not found. Define location with ndk.dir in the local.properties file or with an ANDROID_NDK_ROOT environment variable.")

    return ndkdir
}

//根据不同系统获取ndk-build脚本
def getNdkBuildCmd() {
    def ndkbuild = getNdkDir() + "/ndk-build"
    if (Os.isFamily(Os.FAMILY_WINDOWS))
        ndkbuild += ".cmd"

    return ndkbuild
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:22.2.1'
}

参考:
使用Android Studio构建基于NDK和Boost C++库的应用程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值