概述
参考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。
开始
-
在新建项目的
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 }
-
打开Android Studio的Terminal,并执行以下命令生成JNI头文件(.h)。注意修改路径。命令参数意义参考Android Studio中使用NDK。
javah -d jni -classpath E:AndroidAndroidStudioSDKplatformsandroid-19android.jar;E:AndroidAndroidStudioSDKextrasandroidsupportv4android-support-v4.jar;E:AndroidAndroidStudioSDKextrasandroidsupportv7appcompatlibsandroid-support-v4.jar;E:AndroidAndroidStudioSDKextrasandroidsupportv7appcompatlibsandroid-support-v7-appcompat.jar;....buildintermediatesclassesdebug com.example.l1.ffmpegdemo.MainActivity
执行完后,项目会在
appsrcmain
下新增一个jni文件夹
。
在jni文件夹
中增加源代码(.c)文件,详细代码请查看项目仓库。
再将准备好的FFmpeg动态库加入到项目的jni文件夹
,并增加编译文件Android.mk
。
最后项目变成这样:
继续在
Terminal
中执行NDK的ndk-build
生成动态库。(ndk-build
所在文件夹,即NDK目录如果没有加入环境变量则需要绝对路径)
所有执行的命令如下:
执行完
ndk-build
后项目将在appsrcmian
下,产生两个新的文件夹libs
和obj
,libs
中产生的动态库就是我们需要的。
-
在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++库的应用程序
最后
以上就是如意微笑为你收集整理的使用FFmpeg动态库参考1:http://blog.csdn.net/u011512437/article/details/50290765 使用FFmpeg动态库的全部内容,希望文章能够帮你解决使用FFmpeg动态库参考1:http://blog.csdn.net/u011512437/article/details/50290765 使用FFmpeg动态库所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复