博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ffmpeg-jni-example
阅读量:6624 次
发布时间:2019-06-25

本文共 4078 字,大约阅读时间需要 13 分钟。

ffmpeg-jni-example

This come from my

  • 使用jni调用ffmpeg编译生成的动态库.so,编入apk

  • jni的实现上使用直接传递ffmpeg command的方式,重写了ffmpeg.cmain()接口,只需要传入合适的ffmpeg命令即可使用

支持平台

获取手机cpu平台

adb shell cat /proc/cpuinfo

我的手机是aarch64,即arm64-v8a,所以动态库应该放置在$Project/app/src/main/jniLibs/arm64-v8a,但是我尝试没有成功

好在是兼容32位的,所以可以编译支持arm的库,动态库放置在$Project/app/src/main/jniLibs/armeabi,为了兼容32位,就不能有arm64-v8a目录的存在

how to use

Step 1

编写FFmpegNativeHelper.java

package com.muqing.android.ffmpeg_jni_example;public class FFmpegNativeHelper {    public FFmpegNativeHelper() {    }    static {        System.loadLibrary("...");    }    public int ffmpegCommand(String comand) {        if (comand.isEmpty()) {            return 1;        }        String  args[] = comand.split(" ");        for (int i = 0; i < args.length; i++) {            Log.d("ffmpeg-jni", args[i]);        }        return ffmpeg_entry(args.length, args);    }    public native int ffmpeg_entry(int argc, String[] args);}

Step 2

生成jni cpp header

cd $Project/app/src/main/javajavah -jni com.muqing.android.ffmpeg_jni_example.FFmpegNativeHelper

在该目录下生成com_muqing_android_ffmpeg_jni_example_FFmpegNativeHelper.h,声明了ffmpeg_entry

拷贝到$Project/app/src/main/java/jni目录下

新建com_muqing_android_ffmpeg_example_FFmegNativeHelper.c,如下

#include "com_muqing_android_ffmpeg_jni_example_FFmpegNativeHelper.h"# this method change the main() in ffmpeg.cJNIEXPORT jint JNICALL Java_com_muqing_android_ffmpeg_1jni_1example_FFmpegNativeHelper_ffmpeg_1entry        (JNIEnv * env, jobject thiz, jint argCount, jobjectArray strArray){}

Step 3

拷贝prebuilt shared libray

从我的另一个项目中生成的includelib分别拷贝到$PROJECT/app/src/main/jni/include$PROJECT/app/src/main/jni/prebuilt目录下

因为com_muqing_android_ffmpeg_example_jni_example_FFmpegNativeHelper.c只修改了ffmpeg.c, 所以为了编译通过,需要添加以下文件

include/compat/va_copy.hlibavcodec/arm/mathops.h OR libavutil/x86/mathops.hlibavcodec/mathops.hlibavresample/avresample.hlibavresample/version.hlibavutil/x86/asm.hlibavutil/libm.hlibpostproc/postprocess.hlibpostproc/version.h

这些文件可以从ffmpeg源码中拷贝之后加以修改

Step 4

编写Android.mk

因为是fork了别人的项目,原始项目支持arm,x86平台,所以它的mk文件是这样的

ifeq ($(APP_ABI), x86)include Android.x86.mkelse ifeq ($(APP_ABI), arm64-v8a)include Android.arm64-v8a.mkelseinclude Android.arm.mkendif

根据Application.mk来判断

# APP_ABI := arm64-v8aAPP_ABI := armeabi

下面,我们看看Android.arm.mk

  • 首先,LOCAL_PATH := $(call my-dir)

  • 接着,报杭shared library的module nam和位置,如下

include $(CLEAR_VARS)LOCAL_MODULE:= avcodec-prebuilt-armeabiLOCAL_SRC_FILES:= prebuilt/libavcodec.soinclude $(PREBUILT_SHARED_LIBRARY)
  • 然后,指定将要生成的module name,此处是

LOCAL_MODULE := libffmpegjni
  • 紧接着,包含了需要编译的src文件,不需要包含头文件

LOCAL_SRC_FILES := com_muqing_android_ffmpeg_jni_example_FFmpegNativeHelper.c \                   cmdutils.c \                   ffmpeg_opt.c \                   ffmpeg_filter.c
  • 在接着,LOCAL_SHARED_LIBRARIES

  • 最后,包含include头文件

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

Step 5

ndk-build ndk-build clean     # if needed, clean the cache, then rebuild

Step 6

$Project/app/src/main/java/jni下生成libs.armeabiobj.local.armeabi

拷贝libs.armeabi目录下文件到$Project/app/src/main/jniLibs/armeabi

Step 7

现在需要补全之前FFmpegNativeHelper.java中的lib库

public class FFmpegNativeHelper {    public FFmpegNativeHelper() {    }    static {        System.loadLibrary("avcodec");        System.loadLibrary("avdevice");        System.loadLibrary("avfilter");        System.loadLibrary("avformat");        System.loadLibrary("avutil");        System.loadLibrary("ffmpegjni");        System.loadLibrary("swresample");        System.loadLibrary("swscale");    }    public int ffmpegCommand(String comand) {        if (comand.isEmpty()) {            return 1;        }        String  args[] = comand.split(" ");        for (int i = 0; i < args.length; i++) {            Log.d("ffmpeg-jni", args[i]);        }        return ffmpeg_entry(args.length, args);    }    public native int ffmpeg_entry(int argc, String[] args);}

Step 8

MainActivity.java

Sring ffmpegCommand = "ffmpeg --version";>    new FFmpegNativeHelper().ffmpegCommand(ffmpegCommand);

Todo

使用gradle把Android.mk集成到Android Studio

  • $PROJECT/app/src/main/jni/下添加c/c++文件即可

  • 配置NDK

References

转载地址:http://notpo.baihongyu.com/

你可能感兴趣的文章
android 避免线程的重复创建(HandlerThread、线程池)
查看>>
手游-放开那三国socket协议分析
查看>>
SQL Lazy Spool Eager Spool
查看>>
type的解释
查看>>
Windows Phone 8 开发环境搭建
查看>>
2017:IDC市场规模将持续增长 增速放缓
查看>>
从自动驾驶到学习机器学习:解读2017科技发展的15大趋势
查看>>
SinoBBD探索"一体化"大数据创新发展
查看>>
互联网金融带来新机遇 数据合规性不容忽视
查看>>
智能家庭本周锋闻:专注跨界100年
查看>>
在Linux中永久并安全删除文件和目录的方法
查看>>
全民直播时代 内容监管还得靠技术
查看>>
10款Web开发最佳的Python框架
查看>>
c++ 类的对象与指针
查看>>
Boolean operations between triangle meshes
查看>>
面积并
查看>>
java-JDBC
查看>>
通信术语解释
查看>>
javascript中数据属性与访问器属性
查看>>
对.NET跨平台的随想
查看>>