对于程序员来说,学习一门新技术的第一个demo,一般都是helloworld哈哈
因此本文主要是阐述基于ffmpeg开发的第一个demo,基于Android平台的,前提是需要先编译好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