FFmpeg-helloworld
2018-11-08 本文已影响3人
未见哥哥
1. FFmpeg版本的 Hello World
在 AndroidStudio 控制台中打印 FFMpeg 支持的编解码库。
要完成这个功能主要有一下 4 步:
- 1.1 创建 C++ 项目
创建一个支持 C++ 的 AndroidStudio 工程,具体如何创建请点击查看NDK 基本知识点&第一个JNI示例分析,在这里我们只关注与 FFMpeg 相关的东西。
- 1.2 添加一个 module
创建一个子 library module 并将其添加为 app module 依赖。
image.png-
1.3 把 module 修改为 C++ 项目
- 1.3.1 移动项目中 CmakeList.txt 到 library module 根目录下
- 1.3.2 在 build.gradle 中修改 CMake 的配置
android{ defaultConfig { externalNativeBuild { cmake { cppFlags "-frtti -fexceptions" //指定支持的 cpu 架构 abiFilters 'armeabi' } } sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } } externalNativeBuild { cmake { path "CMakeLists.txt" } } }
- 1.3.3 移动项目中 cpp 文件夹到 library module 中
-
1.4 配置 FFMpeg
- 1.4.1 将编译后的 FFMpeg 的头文件和 so库拷贝到 library 工程中,具体看以下截图,在这里只拷贝 arm 架构的。
-
1.4.2 CmakeList 中配置 ffmpeg
CMakeList 配置 ffmpeg 主要分为一下四步:
- 导入库的头文件路径
导入库文件,是在引用 so 库的头文件时可以使用相对路径。
include_directories(src/main/cpp/include)
- 添加动态库
添加库名称为
avcodec-57
,SHARED 表示动态库,IMPORTED 表示以导入的方式使用该库。add_library( avcodec-57 SHARED IMPORTED)
- 设置动态库路径
> 给名字为 `avcodec-57` 的动态设置对应 so 库的实际位置。
```
set_target_properties( avcodec-57
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavcodec-57.so)
```
* 链接动态库
> 链接 FFMpeg 的动态库。
```
target_link_libraries( # Specifies the target library.
native-lib
# 链接动态库
avcodec-57
...
log )
```
-
1.5 使用该库
- 1.5.1 加载动态库
public class JniDemo { static { System.loadLibrary("native-lib"); System.loadLibrary("swresample-2"); System.loadLibrary("avcodec-57"); System.loadLibrary("avformat-57"); System.loadLibrary("swscale-4"); System.loadLibrary("postproc-54"); System.loadLibrary("avfilter-6"); System.loadLibrary("avdevice-57"); } public native void test(); }
- 1.5.2 调用本地代码打印 FFMpeg 支持的编解码库
#include <jni.h> #include <string> //导入 log 库 #include "android/log.h" extern "C" { #include <libavformat/avformat.h> } //定义 log 库别名 #define LOGI(FORMAT, ...) __android_log_print(ANDROID_LOG_INFO,"liaowejian",FORMAT,##__VA_ARGS__); extern "C" JNIEXPORT void JNICALL Java_com_example_lib_JniDemo_test(JNIEnv *env, jobject instance) { //注册所有的编解码器 av_register_all(); AVCodec *c_temp = av_codec_next(NULL); while (c_temp != NULL) { switch (c_temp->type) { case AVMEDIA_TYPE_VIDEO://视频 LOGI("[Video]:%s", c_temp->name); break; case AVMEDIA_TYPE_AUDIO://音频 LOGI("[Audio]:%s", c_temp->name); break; default://其他 LOGI("[Other]:%s", c_temp->name); break; } c_temp = c_temp->next; } }
- 1.5.3 执行调用程序
关注控制台即可看到输出的打印信息了。
new JniDemo().test();
以上流程就是第一个 FFMpeg 程序,最后的 c++ 代码写的就是输出 FFmpeg 的编解码器,具体怎么操作以后还会继续学习跟进。
记录于 2018年11月8日晚