使用FFmpeg动态库
来源:互联网 发布:c语言if else if 编辑:程序博客网 时间:2024/06/17 20:44
参考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:\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
下,产生两个新的文件夹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.Osapply 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动态库
- Android Studio中使用FFmpeg动态库
- 编译 FFMPEG 动态库
- 在androidstudio2.2上使用ffmpeg动态库
- 使用NDK编译Android所需的FFMPEG动态库
- android ffmpeg 动态库编译
- 使用mingw编译可以让VC使用的动态链接库的ffmpeg
- window环境下使用ndk编译出android studio/Eclipse能使用的ffmpeg动态库
- android使用ffmpeg库
- FFmpeg - C++中使用ffmpeg库
- [转载]FFmpeg - C++中使用ffmpeg库
- FFmpeg - C++中使用ffmpeg库
- 【FFMPEG】使用ffmpeg类库打开流媒体
- 编译ffmpeg的VC动态库
- FFmpeg 1.2 for Android 编译动态库
- 编译ffmpeg生成Android动态库
- ffmpeg编译动态库4Android
- Linux FFmpeg 编译so动态库
- HDU 5791 Two(DP)
- Java泛型编程快速入门
- MySQL技术内幕InnoDB存储引擎学习笔记(第八章)
- windows下设置java环境变量的步骤
- h>>y>>sdfdlkp>ldskfje>lsdkfjrle>lsdkfjdger
- 使用FFmpeg动态库
- 每日一记-mysql中的int(11)-int(4)和int类型
- java web项目发布到服务器上步骤
- CGContextSaveGState与CGContextRestoreGState详解
- 自然对数e的来源以及证明
- Android ListView长按弹出CheckBox,实现全选,反选,批量删除功能
- MySQL技术内幕InnoDB存储引擎学习笔记(第九章)
- 2017网易校招内推笔试题
- 后缀数组水题(待完善)