0
点赞
收藏
分享

微信扫一扫

【Android音视频开发】创建C++项目并导入FFmpeg动态库


创建C++ Android项目

  1. 勾选 c++ support
  2. 【Android音视频开发】创建C++项目并导入FFmpeg动态库_android

  3. 使用cmake

 

        

【Android音视频开发】创建C++项目并导入FFmpeg动态库_动态库_02

     3. 异常信息等支出

         

【Android音视频开发】创建C++项目并导入FFmpeg动态库_android_03

 添加NDK路径

        Project Structure

        

【Android音视频开发】创建C++项目并导入FFmpeg动态库_动态库_04

安装Cmake工具

        Android SDK中安装CMake和LLDB

        

【Android音视频开发】创建C++项目并导入FFmpeg动态库_c++_05

添加module(library)

Module添加C++支持

   1、移动项目中cmakelist.txt到Module根目录下

2、剪切 build.gradle 中
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
到 module 的 build.gradle 中



3、剪切 build.gradle 中
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
到 module 的 build.gradle 中

 4、移动项目中cpp文件夹到module中

 5.添加ffmpeg动态库

        1、module cpp文件夹中创建include文件夹,并添加ffmpeg中include里 面的所有文件

        2、module main文件夹中创建jniLibs,复制arm和x86的.so库到jniLibs中

       

【Android音视频开发】创建C++项目并导入FFmpeg动态库_c++_06

        

        3、在build.gradle中设置编译cpu架构和动态库(.so)路径

        

externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
abiFilters 'armeabi', "x86"
}
}

sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}

cmakelist中配置ffmpeg

 1、导入include路径 include_directories(src/main/cpp/include)

 2、设置动态库路径(如:libavcodec-57.so) set_target_properties( avcodec-57                        PROPERTIES IMPORTED_LOCATION                        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavcodec-57.so)

 3、添加动态库 add_library( avcodec-57 SHARED IMPORTED)

 4、链接动态库 avcodec-57 avdevice-57 avfilter-6 avformat-57 avutil-55 swresample-2 swscale-4 postproc-54

  

Java中加载动态库

        

static {
System.loadLibrary("avutil-55");
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");
}

测试ffmpeg

#define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO,"ywl5320",FORMAT,##__VA_ARGS__);  
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;
}

举报

相关推荐

0 条评论