Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习

这篇具有很好参考价值的文章主要介绍了Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

gcc -S test.i -o test.s//-S 的作用是编译结束生成汇编文件。

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

  1. 汇编阶段

汇编阶段把 .S 文件翻译成二进制机器指令文件 .o ,这个阶段接收.c ,.i ,.s 的文件都没有问题。

下面我们通过以下命令生成二进制机器指令文件 .o 文件:

gcc -c test.s -o test.o

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

  1. 链接阶段

链接阶段,链接的是函数库。可以通过以下命令实现:

gcc -C test.o -o test
./test

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

最后我们通过实际操作,对编译有了一定的了解,当然你也可以直接通过如下命令一步到位:

gcc test.c -o test

到这里我们成功的在 linux 平台生成了可执行文件,试想一下我们可以将这个可执行文件拷贝到安卓手机上执行吗?我们也不猜想了,实际测试下就行,我们把 test 可执行文件 push 到手机 /data/local/tmp 里面, 如下所示:

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

可以看到 test 在手机 /data/local/tmp 的路径下是有可读可写可执行的权限,但是最后执行不成功,这是为什么呢? 其实 主要原因是两个平台的 CPU 指令集不一样,根本就无法识别指令。那么怎么解决这个问题呢? 下面就要用到今天一个比较重要的知识点了, 利用 Android NDK 工具包来对 C/C++ 代码进行交叉编译

交叉编译

简单地来说,交叉编译就是程序的编译环境和实际运行环境不一致,即在一个平台上生成另一个平台上的可执行代码。

在音视频开发中了解交叉编译是很有必要的,因为无论在哪一种移动平台下开发,第三方库都是需要进行交叉编译的。下面我们就以之前的例子来讲解如何在 linux 环境下交叉编译出移动平台上的可执行代码。

了解 NDK

Android 原生开发包 (NDK) 可用于 Android 平台上的 C++ 开发,NDK 不仅仅是一个单一功能的工具,还是一个包含了 API 、交叉编译器、调试器、构建工具等得综合工具集。

下面大致列举了一下经常会用到的组件。

  • ARM 交叉编译器
  • 构建工具
  • Java 原生接口头文件
  • C 库
  • Math 库
  • 最小的 C++ 库
  • ZLib 压缩库
  • POSIX 线程
  • Android 日志库
  • Android 原生应用 API
  • OpenGL ES 库
  • OpenSL ES 库

下面来看一下 Android 所提供的 NDK 跟目录下的结构。

  • ndk-build: 该 Shell 脚本是 Android NDK 构建系统的起始点,一般在项目中仅仅执行这一个命令就可以编译出对应的动态链接库了。
  • ndk-gdb: 该 Shell 脚本允许用 GUN 调试器调试 Native 代码,并且可以配置到 AS 中,可以做到像调试 Java 代码一样调试 Native 代码。
  • ndk-stack: 该 Shell 脚本可以帮组分析 Native 代码崩溃时的堆栈信息。
  • build: 该目录包含 NDK 构建系统的所有模块。
  • platforms: 该目录包含支持不同 Android 目标版本的头文件和库文件, NDK 构建系统会根据具体的配置来引用指定平台下的头文件和库文件。
  • toolchains: 该目录包含目前 NDK 所支持的不同平台下的交叉编译器 - ARM 、X86、MIPS ,目前比较常用的是 ARM 。构建系统会根据具体的配置选择不同的交叉编译器。

下面我们就来为交叉编译的环境变量配置

环境变量配置

  • ndk 在 Linux 上的环境变量配置:

//1. vim /etc/profile
#NDK环境变量
export NDK_HOME=/root/android/ndk/android-ndk-r17c
export PATH= P A T H : PATH: PATH:NDK_HOME

//2. 保存
source /etc/profile

//3. 测试
ndk-build -v

如果出现如下字样,就证明配置成功了。

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

  • 交叉编译在 Linux 上的环境变量配置(做一个参考,采坑之后的环境配置):

export NDK_GCC_x86=“/root/android/ndk/android-ndk-r17c/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc”
export NDK_GCC_x64=“/root/android/ndk/android-ndk-r17c/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-gcc”
export NDK_GCC_arm=“/root/android/ndk/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc”
export NDK_GCC_arm_64=“/root/android/ndk/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc”

export NDK_CFIG_x86=“–sysroot=/root/android/ndk/android-ndk-r17c/platforms/android-21/arch-x86 -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include/i686-linux-android”
export NDK_CFIG_x64=“–sysroot=/root/android/ndk/android-ndk-r17c/platforms/android-21/arch-x86_64 -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include/x86_64-linux-android”
export NDK_CFIG_arm=“–sysroot=/root/android/ndk/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi”
export NDK_CFIG_arm_64=“–isysroot=/root/android/ndk/android-ndk-r17c/platforms/android-21/arch-arm64 -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include -isystem -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include/aarch64-linux-android”

export NDK_AR_x86=“/root/android/ndk/android-ndk-r17c/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ar”
export NDK_AR_x64=“/root/android/ndk/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar”
export NDK_AR_arm=“/root/android/ndk/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar”
export NDK_AR_arm_64=“/root/android/ndk/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar”

你可以根据自己的 ndk 路径对应我的环境变量来进行配置。下面我们就用 ndk gcc 来对 test.c 进行交叉编译,步骤如下:

  1. 首先找到 /root/android/ndk/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习
执行如下命令:

/root/android/ndk/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -o test test.c

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

  1. 这种错误是说在我们编得时候编译器找不到我们引入的 stdio.h 头文件,那怎么告诉编译器 stdio.h 头文件在哪里呢? 下面知识点说明怎么指定这些报错的头文件

  2. 指定头文件代码

/root/android/ndk/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/root/android/ndk/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include -pie -o test test.c

上面出现了几个命令符号,不了解了可以看一下如下解释:

–sysroot=?: 使用 ?作为这一次编译的头文件与库文件的查找目录,查找下面的 usr/include 目录。

-isystem ?(主要中间有一个英文空格) : 使用头文件查找目录,覆盖 --sysroot, 查找 ?/usr/include 目录下面的头文件。

-isystem ?(主要中间有一个英文空格): ** 指定头文件的查找路径。

-I?: 头文件的查找目录,I 是大写。

这样编译之后还是会报一个 asm/types.h 文件找不到,我们还要继续修改一下路径,如下

/root/android/ndk/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/root/android/ndk/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include -isystem /root/android/ndk/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi -pie -o test test.c

这样就能编译成一个 Android 平台可执行的文件了,这样看起来路径太多不易阅读,大家可以参考我提供的全局变量配置来进行设置,最后一行命令解决,如下:

$NDK_GCC_arm $NDK_CFIG_arm -pie -o test test.c 复制代码

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

可以看到,我们使用 Android NDK 编译出来的可执行文件已经在 Linux 平台下不可执行了。下面我们将 test 文件导入到 手机 /data/local/tmp 目录。

  1. 将 NDK 交叉编译出来的 test 可执行文件,导入 Android 手机中并执行 test 文件。

根据上面的录屏,我们知道已经成功的在 Android 设备下执行了 NDK 交叉编译后的 test 文件了。

下面我们利用 NDK 工具交叉编译 test.c 输出静态动态库。

动态库 & 静态库

编译静态库

  1. 将 test.c 使用 NDK GCC 编译为 .o 文件 ,命令如下:

$NDK_GCC_arm $NDK_CFIG_arm -fpic -c test.c -o test.o

如果出现如下文件,证明已经成功了。

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

  1. 使用 NDK arm-linux-androideabi-ar 工具将 test.o 文件生成 test.a 静态库,命令如下:

$NDK_AR_arm r test.a test.o

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

之后我们把 test.a 文件导入到 AS 中,来对 .a 的使用。

编译动态库

在编译动态库的时候我们需要指定 -fPIC -shared 额外参数给编译器,完整命令如下:

$NDK_GCC_arm $NDK_CFIG_arm -fpic -shared test.c -o libTest.so

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

动态库与静态库的区别

在平时工作中我们经常把一些常用的函数或者功能封装为一个个库供给别人使用,java开发我们可以封装为 ja r包提供给别人用,安卓平台后来可以打包成 aar 包,同样的,C/C++ 中我们封装的功能或者函数可以通过静态库或者动态库的方式提供给别人使用。

Linux 平台静态库以 .a 结尾,而动态库以 .so 结尾。

那静态库与动态库有什么区别呢?

1. 静态库

与静态库连接时,静态库中所有被使用的函数的机器码在编译的时候都被拷贝到最终的可执行文件中,并且会被添加到和它连接的每个程序中:

优点:运行起来会快一些,不用查找其余文件的函数库了。

缺点:导致最终生成的可执行代码量相对变多,运行时, 都会被加载到内存中. 又多消耗了内存空间。

2. 动态库

与动态库连接的可执行文件只包含需要的函数的引用表,而不是所有的函数代码,只有在程序执行时, 那些需要的函数代码才被拷贝到内存中。

优点:生成可执行文件比较小, 节省磁盘空间,一份动态库驻留在内存中被多个程序使用,也同时节约了内存。

缺点:由于运行时要去链接库会花费一定的时间,执行速度相对会慢一些。

静态库是时间换空间,动态库是空间换时间,二者均有好坏。

如果我们要修改函数库,使用动态库的程序只需要将动态库重新编译就可以了,而使用静态库的程序则需要将静态库重新编译好后,将程序再重新编译一遍。

mk & cmake

上一小节我们通过 NDK 交叉编译了 test.c 为动态静态库,那么该小节我们就基于 makefile 和 cmake 来构建一个 C/C++ 的 Android 程序, 并使用 test .a /libTest.so

mk

Android.mk 是在 Android 平台上构建一个 C 或者 C ++ 语言编写的程序系统的 Makefile 文件,不同的是, Android 提供了一些列内置变量来提供更加方便的构建语法规则。Application.mk 文件实际上是对应用程序本身进行描述的文件,它描述了应用程序要针对哪些 CPU 架构打包动态 so 包、要构建的是 release 包还是 debug 包以及一些编译和链接参数等。

语法基础

1. Android.mk

  • LOCAL_PATH :=$(call my-dir)

返回当前文件在系统中路径,Android.mk 文件开始时必须定义该变量。

  • include $(CLEAR_VARS), 表明清楚上一次构建过程的所有全局变量,因为在一个 Makefile 编译脚本中,会使用大量的全局变量,使用这行脚本表明需要清除掉所有的全局变量。

  • LOCAL_SRC_FILES, 要编译的 C 或者 CPP 的文件,注意这里不需要列举头文件,构建系统会自动帮组开发者依赖这些文件。

  • LOCAL_LDLIBS:= -L定编译过程所依赖的提供的动态静态库,变量代表的是下面的目录(SYSROOT)/usr/lib -Ilog -IOpenSLES -IGLESv2 -IEGL -Iz,定编译过程所依赖的 NDK 提供的动态静态库, SYSROOT 变量代表的是 NDK_ROOT 下面的目录 NDK 提供的动态与静态库,SYSROOT 变量代表的是 NDK_ROOT 下面目录 $NDK_ROOT/platforms/android-21/arch-arm, 而在这个目录的 usr/lib/ 目录下有很多对应的 so 的动态库以及 .a 的静态库。

  • LOCAL_CFLAGS , 编译 C 或者 CPP 的编译标志,在实际编译的时候会发送给编译器。比如常用的实例是加上 -DAUTO_TEST , 然后在代码中就可以利用条件判断 #ifdef AUTO_TEST 来做一些与自动化测试相关的事情。

  • LOCAL_LDFLAGS, 链接标志的可选列表,当对目标文件进行链接以生成输出文件的时候,将这些标志带给链接器。该指令与 LOCAL_LDLIBS 有些类似,一般情况下,该选项会用于指定第三方编译的静态库,LOCAL_LDLIBS 经常用于指定系统的库(比如 log、OpenGLES、EGL 等)。

  • LOCAL_MODULE, 该模块的编译的目标名,用于区分各个模块,名字必须是唯一并不包含空格的,如果编译目标是 so 库,那么该 so 库的名称就是 lib 项目名 .so。

  • include $(BUILD_SHARED_LIBRARY) ,其实类似的 include 还有很多,都是构建系统提供的内置变量,该变量的意义是构建动态库,其他的内置变量还包括如下几种。

  • —BUILD_STATIC_LIBRARY: 构建静态库

  • —PREBUILT_STATIC_LIBRARY: 对已有的静态库进行包装,使其成为一个模块。

  • —PREBUILT_SHARED_LIBRARY: 对已有的静态库进行包装,使其成为一个模块。

  • —BUILD_EXECUTABLE: 构建可执行文件。

2. Application.mk

  • APP_ABI := XXX ,这里的 XXX 是指不同平台,可以选填的有 x86 、mips 、armeabi、armeabi-v7a、all 等,值得一提的是,若选择 all 则会构建构建出所有平台的 so ,如果不填写该项,那么将默认构建为 armeabi 平台下的库。
  • APP_STL := gnustl_static ,NDK 构建系统提供了由 Android 系统给出的最小 C++ 运行时库 (、system/lib/libstdc++.so)的 C++ 头文件。
  • APP_CPPFLAGS :=-std=gnu++11 -fexceptions, 指定编译过程的 flag ,可以在该选项中开启 exception rtti 等特性,但是为了效率考虑,最好关闭 rtti。
  • NDK_TOOLCHAIN_VERSION = 4.8,指定交叉工具编译链里面的版本号,这里指定使用 4.8。
  • APP_PLATFORM :=android-9,指定创建的动态库的平台
  • APP_OPTIM := release,该变量是可选的,用来定义 “release” 或者 “debug” ,“release” 模式是默认的,并且会生成高度优化的二进制代码;“debug” 模式生成的是未优化的二进制代码,但是可以检测出很多的 BUG, 经常用于调试阶段,也相当于在 ndk-build 指令后边直接加上参数 NDK_DEBUG=1。
构建 C/C++ Android 项目

效果:

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

Makefile 的方式我们只做一个了解,因为以后我们构建 C/C++ 的 Android 项目都是用 cmake 方式来构建,所以我们重点掌握 cmake 就行。

cmake

之前做 NDK 开发或者老的项目都是基于 Android.mk、Application.mk 来构建项目的,但从 AS 2.2 之后便开始采用 CMake 的方式来构建 C/C++ 项目,采用 CMake 相比与之前的 Android.mk、Application.mk 方便简单了许多。下面我们简单的来介绍下 cmake 基础语法吧。

语法基础

#1. 指定 cmake 的最小版本
cmake_minimum_required(VERSION 3.4.1)

#2. 设置项目名称
project(demo)

#3. 设置编译类型
add_executable(demo test.cpp) # 生成可执行文件
add_library(common STATIC test.cpp) # 生成静态库
add_library(common SHARED test.cpp) # 生成动态库或共享库

#4. 明确指定包含哪些源文件
add_library(demo test.cpp test1.cpp test2.cpp)

#5. 自定义搜索规则并加载文件
file(GLOB SRC_LIST “.cpp" "protocol/.cpp”)
add_library(demo ${SRC_LIST}) //加载当前目录下所有的 cpp 文件

或者

file(GLOB SRC_LIST “.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/
.cpp”)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习
Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习
Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习
Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

尾声

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习,程序员,android,音视频,学习

  • 自行下载直达领取链接:点击这里前往GitHub

分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

[外链图片转存中…(img-bNkXVgbo-1711323662790)]

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
[外链图片转存中…(img-gF5JC6pW-1711323662790)]文章来源地址https://www.toymoban.com/news/detail-845802.html

  • 自行下载直达领取链接:点击这里前往GitHub

到了这里,关于Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器

    #!/bin/sh HTTP_FLV_MODULE_PATH=…/nginx-http-flv-module-1.2.7 OpenSSL_PATH=…/openssl-1.1.1d #–prefix=./bin 代表编译完成之后输出的路径地址 #–add-module 将拓展模块添加到当前一起编译 ./configure --prefix=./bin –add-module= H T T P F L V M O D U L E P A T H   − − w i t h − o p e n s s l = HTTP_FLV_MODULE_PATH --with

    2024年04月15日
    浏览(44)
  • 【Android音视频】MacOS上FFmpeg5.0.1编译

    1. FFmpeg官网下载链接(推荐下载release的版本): Download FFmpeg http://ffmpeg.org/download.html#releases  尽情去下载并开始编译吧 2. 下载压缩包,解压至自己想要的文件路径下即可。个人习惯用全英文路径,避免出现奇怪的问题。 3. Android Studio请预先下载好。点击AS右上角“SDK Manager”

    2024年02月02日
    浏览(32)
  • 音视频开发系列(6)——全面了解Android MediaFormat

    MediaFormat 是 Android 平台中用于描述音视频格式的类,它提供了许多 API 用于设置和获取音视频的格式信息。以下是 MediaFormat 类的主要 API: 用于创建音频和视频格式的 MediaFormat 对象。需要指定媒体类型(例如 audio/mp4a-latm 或 video/avc)、媒体的采样率、通道数、码率、帧率等信

    2024年02月01日
    浏览(29)
  • Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准

    本文来自笔者本人的语雀博客,由于语雀升级后不再满足笔者的需求,因此之后笔者会陆续将一些之前已经发布但尚有价值的文章搬家到CSDN。 作为音视频行业从业者,怎么能不理解H.264视频编解码技术标准?本篇文章主要记录笔者学习过程中对众多优秀博客内容的摘抄整理,

    2023年04月09日
    浏览(38)
  • Android修行手册-基础优化系列图片篇,ios音视频面试内容

    图片款=(480/480)*400=400 占用内存为300*400*4=480000 那么它占用内存为什么是变化的? Android会先解析图片文件本身的数据格式,然后还原成Bitmap对象,Bitmap的大小就跟上面的计算方式相关联。 再举例1080*452的png图片,图片占用存储空间大小为56kb,内存如图: 上图一目了然,不

    2024年04月27日
    浏览(40)
  • ffmpeg系列学习——FFmpeg的音视频处理

    1.音视频的采样率、采样位深度和声道数 音频和视频的采样率、采样位深度和声道数是媒体文件中的重要参数,它们会直接影响到音视频的质量和文件大小。下面对它们进行详细解释: 采样率 采样率指音频每秒钟采样的次数,用赫兹(Hz)表示。采样率越高,音频的还原度越

    2024年02月04日
    浏览(37)
  • 【原理+实战+视频+源码】抖音,快手大热背后——Android 贴心的音视频学习指南来咯

    (三)C 与 C++之预处理命令与用 typedef 命名已有类型 JNI 模块 JNI 开发之 静态注册与动态注册(一) JNI 开发之方法签名与 Java 通信(二) JNI 开发之局部引用、全局引用和弱全局引用(三) 二、中级进阶篇 学习 Android 平台 OpenGL ES API,了解 OpenGL 开发的基本流程,使用 OpenG

    2024年04月22日
    浏览(56)
  • 【原理+实战+视频+源码】抖音,快手大热背后——Android-贴心的音视频学习指南来咯

    下面将这份文档的内容以图片的形式展现出来,但篇幅有限只能展示部分,如果你需要“高清完整的pdf版”,可以直接点击我的【GitHub】即可免费领取。 一、初级入门篇 初级入门篇主要是接触Android多媒体展示相关的API, 通过单独的列举和使用这些API,对Android音视频处理有

    2024年04月17日
    浏览(34)
  • Android开发音视频方向学习路线及资源分享,学完还怕什么互联网寒冬?

    好了,回归正题。 光看大纲,大家都知道要学习音视频录制,编码,处理,但是具体不知道怎么做,也不知道怎么入门。我自己在入门的时候也一样,靠着搜索引擎自己一点一点的积累,在这里当然要谢谢在该领域无私奉献的大佬们。所以在这里,我会对知识进行细化,运用

    2024年04月11日
    浏览(39)
  • 【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码

    在讲NuPlayer时,NuPlayer解码部分会创建MediaCodec,并且最终到达OMX框架,先看MediaCodec的 init 函数 从init函数中可以看到,首先创建了 ACodec ,并且初始化了 ALooper 、 AMessage ,由于ACodec继承自 AHandler ,那么一套消息机制就有了。最后发送 kWhatInit 消息,收到消息的逻辑位于ACodec.

    2023年04月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包