Android studio集成FFmpeg

**

Android studio集成FFmpeg

**

FFmpeg集成有以下几步
1.在Android studio中创建Native C++项目
2.添加FFmpeg的头文件
3.添加FFmpeg的so文件
4.调用FFmpeg方法测试集成是否成功

Android studio中创建项目

创建一个新项目 在Create new Project界面的Phone and Tablet中选择最后一个Native C++项目
next后自定义项目名称和包名语言选择kotlin
finish即可创建好项目

添加FFmpeg的头文件

编译好之后,项目文件结构换成Project,这样目录结构比较清晰。
将之前编译好的FFmpeg的头文件目录(include整个目录)拷贝到app目录下;

这样头文件就算是加进来了。

添加FFmpeg的so文件

在libs目录下添加你编译出来的FFmpeg的cpu目录,例如我添加的是armeabi-v7a;然后就把之前编译出来的所有so包放到新添加的cpu目录下;然后在app模块的build.gradle文件的android->defaultConfig下边添加:

    defaultConfig {

        ndk{ abiFilters 'armeabi-v7a'}//此处要和你编译的处理器版本号一致

        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }

表示jni的资源路径是在libs目录下的;然后再到app下的CMakeLists.txt文件中添加:

set(FF ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs)
add_library(avcodec SHARED IMPORTED)
add_library(avformat SHARED IMPORTED)
add_library(avutil SHARED IMPORTED)
add_library(swscale SHARED IMPORTED)
add_library(swresample SHARED IMPORTED)
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${FF}/${ANDROID_ABI}/libavcodec.so)
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION ${FF}/${ANDROID_ABI}/libavformat.so)
set_target_properties(avutil PROPERTIES IMPORTED_LOCATION ${FF}/${ANDROID_ABI}/libavutil.so)
set_target_properties(swscale PROPERTIES IMPORTED_LOCATION ${FF}/${ANDROID_ABI}/libswscale.so)
set_target_properties(swresample PROPERTIES IMPORTED_LOCATION ${FF}/${ANDROID_ABI}/libswresample.so)

target_include_directories(native-lib PRIVATE
        ../../../include)

再把心添加的库文件链接到native-lib下,也就是将如下代码:

target_link_libraries(
        native-lib
        ${log-lib})

改成:

target_link_libraries(
        native-lib
        avcodec avformat avutil swscale swresample
        ${log-lib})

这样到这里添加so文件也就完成了。

调用FFmpeg的函数测试是否集成成功
so添加完,再编译一下之后;就可以在native-lib.cpp文件中的stringFromJNI方法里添加一句:

hello += std::to_string(avutil_version());

并添加头文件

extern "C" {
#include "libavutil/avutil.h"
}

extern "c"这一个是表示这部分按照c语言的规则来编译,至于为什么要这样可以自行查询。
这样不出意外,运行程序就能在屏幕中看到很长一串文本,包含的是ffmpeg编译的配置信息和脚本的./configure 之后的那部分有点类似。
到这里FFmpeg的集成就基本完成了。

注意:
这里有个坑大家注意一下,运行的时候可能会出现以下问题
遇见这个问题就在app目录下的build.gradle中的android项下添加

 // 项目中依赖的第三方库越来越多时,有可能会出现两个依赖库中存在同一个(名称)文件 如果这样,Gradle在打包时就会提示错误(警告)。那么就可以根据提示,然后使用以下方法将重复的文件剔除
 packagingOptions {
     // pickFirsts:当出现重复文件,会使用第一个匹配的文件打包进入apk
     pickFirst 'lib/armeabi-v7a/libavformat.so'
     pickFirst 'lib/armeabi-v7a/libavcodec.so'
     pickFirst 'lib/armeabi-v7a/libavfilter.so'
     pickFirst 'lib/armeabi-v7a/libswscale.so'
     pickFirst 'lib/armeabi-v7a/libswresample.so'
     pickFirst 'lib/armeabi-v7a/libavutil.so'
   }

如果在开发板中无可视化界面,可以用以下命令输出调用包所显示的信息

#include <android/log.h>
#define TAG "FaceSDKNative"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)

LOGD("********************LOG:%s***********************",hello.c_str());

例如我的代码和运行结果

#include <jni.h>
#include <string>
#include <android/log.h>
#define TAG "FaceSDKNative"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)

extern "C"
{
#include "libavutil/avutil.h"
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication1_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    hello += std::to_string(avutil_version());
    LOGD("********************LOG:%s***********************",hello.c_str());
    return env->NewStringUTF(hello.c_str());
}

运行结果
在这里插入图片描述
文章参考视频播放器之Android Studio集成FFmpeg
如有侵权,请联系作者删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值