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

创建C++ Android项目

  1. 勾选 c++ support
  2.   
  3.  使用cmake 

 

        

     3. 异常信息等支出

         

 添加NDK路径

        Project Structure

        

安装Cmake工具

        Android SDK中安装CMake和LLDB

        

添加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中

               

        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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值