FFmpeg版Helloworld(Android平台)

对于程序员来说,学习一门新技术的第一个demo,一般都是helloworld哈哈

因此本文主要是阐述基于ffmpeg开发的第一个demo,基于Android平台的,前提是需要先编译好ffmpeg的so库,这个可以在前面的一篇文章中参考:

FFmpeg编译为so库导入安卓开发

一、我的环境

1、Androidstudio版本:4.1.1

2、ndk版本:r17c

二、第一个demo:helloworld

1、先准备好ffmpeg的so库,如上所述ffmpeg编译的文章最终可以得到所需的so库:

2、新建一个带有native C++的工程:

 

 

2、在libs目录下,将编译好的so库和相关头文件放进来。

本例子项目用在64bit的安卓手机上,CPU架构是arm64-v8a的,因此将刚才编译好的arm64-8va下的so库导进来,并将ffmpeg编译后的include下的arm64-8va的下头文件放进来Androidstudio的libs/include。如下:

3、在如下路径的CmakeLists.txt中,修改下面的内容,将so库真正编译进来。

增加如下内容:

第一句是将头文件包含进来,方便使用

后面的主要是添加这些so库。

include_directories(${CMAKE_SOURCE_DIR}/../../../libs/includes)
set(DIR ${CMAKE_SOURCE_DIR}/../../../libs/arm64-v8a)
add_library(avcodec
        SHARED
        IMPORTED)
set_target_properties(avcodec
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libavcodec.so)

add_library(avdevice
        SHARED
        IMPORTED)
set_target_properties(avdevice
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libavdevice.so)
add_library(avformat
        SHARED
        IMPORTED)
set_target_properties(avformat
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libavformat.so)
add_library(avutil
        SHARED
        IMPORTED)
set_target_properties(avutil
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libavutil.so)
add_library(avresample
        SHARED
        IMPORTED)
set_target_properties(avresample
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libavresample.so)
add_library(swresample
        SHARED
        IMPORTED)
set_target_properties(swresample
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libswresample.so)
add_library(swscale
        SHARED
        IMPORTED)
set_target_properties(swscale
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libswscale.so)
add_library(avfilter
        SHARED
        IMPORTED)
set_target_properties(avfilter
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libavfilter.so)

 最后还需要在target_link_libraries中将这些库加进来。


target_link_libraries( # Specifies the target library.
                       native-lib
                       avfilter
                       avcodec
                       avdevice
                       avformat
                       avutil
                       avresample
                       swresample
                       swscale
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
                       
                       

4、在app目录下的build.gradle中的defaultConfig下添加如下内容:

 在cmake下增加如下内容。

defaultConfig {
    applicationId "com.example.mydemo1_helloworld"
    minSdkVersion 26
    targetSdkVersion 30
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    externalNativeBuild {
        cmake {
            cppFlags "-std=c++14 -frtti -fexceptions"
            abiFilters 'arm64-v8a'
        }
    }
}

5、在File ->Project Structure -> Modules下,需要修改NDK的版本号,将版本号修改为上面所述的下载的r17c的NDK压缩包解压后的版本号。

ps:ndk版本号的获取,下载好ndk压缩包后,解压,打开source.properties文件,就可以看到完整的一个ndk的版本号。并将ndk工具的文件夹名字修改为这个版本号,并放到Androidstudio的SDK安装目录下,就可以在这里通过完整版本号导入了。

6、上述步骤基本上就导入成功了,现在我们可以来验证一下是否导入ok。

在native-lib.cpp中,通过调用libavcodec库中的avcodec_configuration()函数获取相关信息,并打印出来,如果能ok,就说明so库导入成功了,如下:

#include <jni.h>
#include <string>
#ifdef __cplusplus
extern "C" {
#endif
#include <libavcodec/avcodec.h>
#ifdef __cplusplus
}
#endif

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_mydemo1_1helloworld_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = avcodec_configuration();
    return env->NewStringUTF(hello.c_str());
}

注意这里的引入ffmpeg的头文件,需要加个extern "C",因为ffmpeg是用C写的。

若成功,运行APP可以得到如下:

在小米5上的运行情况:

该demo已放到github上,有需要的可以下载看看:

 https://github.com/weekend-y/FFmpeg_Android_Demo/tree/master/mydemo1_helloworld

猜你喜欢

转载自blog.csdn.net/weekend_y45/article/details/124904356