作者: | 来源:互联网 | 2023-08-14 10:06
对于程序员来说,学习一门新技术的第一个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(avcodecSHAREDIMPORTED)
set_target_properties(avcodecPROPERTIES IMPORTED_LOCATION${DIR}/libavcodec.so)add_library(avdeviceSHAREDIMPORTED)
set_target_properties(avdevicePROPERTIES IMPORTED_LOCATION${DIR}/libavdevice.so)
add_library(avformatSHAREDIMPORTED)
set_target_properties(avformatPROPERTIES IMPORTED_LOCATION${DIR}/libavformat.so)
add_library(avutilSHAREDIMPORTED)
set_target_properties(avutilPROPERTIES IMPORTED_LOCATION${DIR}/libavutil.so)
add_library(avresampleSHAREDIMPORTED)
set_target_properties(avresamplePROPERTIES IMPORTED_LOCATION${DIR}/libavresample.so)
add_library(swresampleSHAREDIMPORTED)
set_target_properties(swresamplePROPERTIES IMPORTED_LOCATION${DIR}/libswresample.so)
add_library(swscaleSHAREDIMPORTED)
set_target_properties(swscalePROPERTIES IMPORTED_LOCATION${DIR}/libswscale.so)
add_library(avfilterSHAREDIMPORTED)
set_target_properties(avfilterPROPERTIES IMPORTED_LOCATION${DIR}/libavfilter.so)
最后还需要在target_link_libraries中将这些库加进来。
target_link_libraries( # Specifies the target library.native-libavfilteravcodecavdeviceavformatavutilavresampleswresampleswscale# 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 26targetSdkVersion 30versionCode 1versionName "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
#include
#ifdef __cplusplus
extern "C" {
#endif
#include
#ifdef __cplusplus
}
#endifextern "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上的运行情况: