热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FFmpeg版Helloworld(Android平台)

对于程序员来说,学习一门新技术的第一个demo,一般都是helloworld哈哈因此本文主要是阐述基于ffmpeg开发的第一个demo,

对于程序员来说,学习一门新技术的第一个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上的运行情况:

 


推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有