音视频基础能力之 Andoid 音频篇(二):音频录制

一、概述

MediaRecorder 是 Android 平台 android.media.* 目录下对外提供的高级 API,它内部封装了采集、编码、封装的逻辑操作,最终生成的文件格式是多媒体容器格式,例如 mp4, ogg 等文件格式。如果您对录制格式不是很清楚的话,可以点击看下这篇文章:一文搞清多媒体格式(建议收藏)

MediaRecorder 通常是音频、视频搭配一起使用,也可以单独使用。由于我们这篇主要来讲述音频采集相关的内容,我们将着重讲解音频相关的部分,最终提供的 samplecode 生成的文件格式也仅只有音频轨。

MediaRecorder 的使用场景通常是本地录制,如果您没有对音频、视频流有额外的处理操作,使用这个 API 无疑是最佳的解决方案。

在这里插入图片描述

上图是官方提供的 MediaRecorder 运行状态图。我们只要理解了 MediaRecorder 的运行机制,便能很好的使用它。下面详细的讲讲 MediaRecorder 的 API 调用过程中,MediaRecorder的状态切换以及完成了哪些工作。

二、工作流

下面贴出一段 MediaRecorder 初始化的代码,虽然很简洁,但是一点都不简单。执行这些代码的过程中,MediaRecorder 帮助我们完成了很多繁重的工作。

//初始化配置
recorder = MediaRecorder().apply {
   
   
    setAudioSource(MediaRecorder.AudioSource
<think>好的,用户现在遇到了Android编译错误,具体是Android.bp文件中的依赖可见性问题。首先,我需要理解这个错误的含义。错误信息提到模块“services.core,unboosted”的变体“android_common”依赖了某个模块,但可能缺少可见性声明,需要将“//frameworks/base/services/core”添加到其可见性中。 首先,Android.bp是使用Blueprint构建系统的文件,用于描述模块及其依赖。可见性(visibility)控制其他模块是否可以依赖当前模块。如果模块A依赖模块B,但B没有将A所在的路径添加到可见性列表,就会报类似的错误。 接下来,分析可能的原因。用户的情况是模块“services.core,unboosted”在构建时依赖了另一个模块(可能是在同一目录或其他位置),但被依赖的模块的可见性配置没有允许当前模块访问。Android.bp中的每个模块通常有visibility字段,指定哪些其他模块可以依赖它。例如,visibility: ["//frameworks/base/services/core:__subpackages__"] 表示允许该目录下的子包依赖。 解决方法可能包括:检查被依赖模块的visibility字段,确保当前模块的路径被包含在内;或者在当前模块的依赖声明中使用正确的可见性路径。例如,如果被依赖的模块是//frameworks/base/services/core中的某个模块,那么需要在其visibility中添加当前模块的路径,或者调整当前模块的依赖方式。 另外,需要注意Android.bp的语法,visibility通常是一个列表,包含其他模块的路径模式,比如"//packages/apps/MyApp:__pkg__"表示允许该应用包内的模块依赖。如果可见性设置过严(比如只允许特定路径),而当前模块不在其中,就会导致依赖失败。 可能的相关问题需要围绕Android.bp的可见性配置、模块依赖的常见问题、Blueprint构建系统的基本概念等展开,帮助用户进一步理解和解决类似问题。 </think>这个编译错误与Android的Blueprint构建系统(`Android.bp`)的模块可见性(Visibility)配置有关,通常是由于被依赖的模块未允许当前模块访问其可见性导致的。以下是具体分析和解决方法: ### **错误原因** 在Android的Blueprint构建系统中,每个模块(如`cc_library`、`java_library`等)可以通过`visibility`字段声明**允许哪些其他模块依赖自己**。如果模块A尝试依赖模块B,但模块B的`visibility`列表中未包含模块A的路径,就会触发此错误。 错误信息中提到的 `depends on / You may need to add "//frameworks/base/services/core" to its visibility` 表示:当前模块(`services.core,unboosted`)依赖了某个未明确允许其访问的模块,需要将路径 `//frameworks/base/services/core` 添加到被依赖模块的`visibility`配置中,以允许当前模块访问。 ### **解决方法** 1. **定位被依赖的模块** 首先需要确定当前模块(`services.core,unboosted`)具体依赖了哪个模块(假设为模块X)。通常错误日志会隐含提示(如模块X的路径),或通过构建日志的依赖链分析。 2. **修改被依赖模块(X)的 `visibility` 字段** 在模块X的`Android.bp`文件中,添加当前模块所在路径到其`visibility`列表中。例如: ```bp // 模块X的 Android.bp 文件 java_library { name: "module_x", // ...其他配置 visibility: [ "//frameworks/base/services/core:__subpackages__", // 允许 services/core 目录下的子包依赖 "//frameworks/base/services/core", // 直接允许当前模块路径 ], } ``` 其中: - `"//path/to/dir:__subpackages__"` 表示允许该目录下的所有子包依赖; - `"//path/to/dir"` 表示允许该目录下的模块依赖。 3. **验证可见性规则** 确保`visibility`的路径与当前模块的实际路径匹配。例如,若当前模块位于`frameworks/base/services/core`目录下,则路径应为`//frameworks/base/services/core`。 ### **补充说明** - **可见性的作用**:防止模块被未授权的其他模块依赖,避免构建时的依赖混乱。 - **默认可见性**:若模块未声明`visibility`,默认仅允许同目录下的模块依赖;若声明为`["//visibility:public"]`则允许所有模块依赖(不推荐,可能破坏封装)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值