Android 音频(一) _ 采样量化编码 & AudioRecord 录制音频

这篇具有很好参考价值的文章主要介绍了Android 音频(一) _ 采样量化编码 & AudioRecord 录制音频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模拟信号

音频承载着声音信息,而声音是连续变化的信息。物理中把承载信息的载体称为信号,把连续变化的信息称为模拟信号,它在坐标轴中表现为如下形态:

Android 音频(一) _ 采样量化编码 & AudioRecord 录制音频

计算机只能处理0和1,即离散值。音频这种模拟信号得转换成离散值才能被计算机处理。这个转化过程称为模拟信号数字化,分为三个步骤:

1. 采样

采样是对连续信号在时间上进行离散,即按照特定的时间间隔在原始的模拟信号上逐点采集瞬时值。采样的可视化效果如下图所示:

Android 音频(一) _ 采样量化编码 & AudioRecord 录制音频

原本连续的曲线被一根根离散的竖直线条代替。这些线条越密集,将它们相连后形成的曲线就越接近原始模拟信号。

物理中用采样频率来表示采样的密集程度,即每秒采样次数(采样数/秒),它用赫兹(Hz)表示

2. 量化

虽然连续值已被采样成若干离散值,但每个离散值的取值可能有无限多个。为了给每一个离散值都对应一个数字码,必须将无限种取值转化为有限种取值(对于只能处理二进制的计算机来说,取值的可能数应该是2的倍数)。物理中把这种通过四舍五入分级取整的方法称为量化。量化后的数字信号如下图所示:

Android 音频(一) _ 采样量化编码 & AudioRecord 录制音频

量化后的音频变得死板有棱角,就好像人类和机器人的差别。

3. 编码

模拟信号经过采样变成离散值,每一个离散值经过量化都对应一个二进制,将这些二进制按时间序列组合在一起就称为编码

经过采样量化编码形成的是音频的原始数据,这种原始数据格式称为PCM(Pulse Code Modulation),即是采样量化编码的英文表示。

.pcm 后缀的文件是非常非常大的,这增加了存储和网络传输的成本。遂 PCM 这样原始的无损音频还得经过一次压缩编码

音频存在冗余信息,才能被压缩。比如人耳能辨识的声音频率范围为20Hz~20KHz,该频率以外的声音都是冗余信息。再比如强弱信号同时出现,强弱差距过大,以至于弱信号完全被掩盖,弱信号就是冗余信息。

音频有很多压缩编码的格式,以下是 Android 官方支持的格式: Android 音频(一) _ 采样量化编码 & AudioRecord 录制音频

在移动端最为常用的格式是 AAC,即 Advanced Audio Coding,是一种专为声音数据设计的文件压缩格式。它采用了更加高效的编码方式,使得它拥有和 MP3 相当的音质及更小的体积。

压缩编码由两种执行方式,交由 GPU 或是 CPU 执行,前者称为硬编码后者称为软编码,硬编码速度快,但兼容差,会存在编码失败的情况。软编码速度慢,但兼容性好。

录制 PCM 音频

Android 提供了两种录制音频的方式:1. MediaRecorder 2. AudioRecord

如果没有优化音频的需求,完全可以使用 MediaRecorder 直接输出 AAC 格式的音频。

而音频优化,比如降噪,增益算法都是基于 PCM 格式的。这就不得不使用 AudioRecord 来录制音频。

构建 AudioRecord 对象

AudioRecord 的构造函数包含 6 个参数:

  1. 音频源:表示从哪里采集音频,通常是麦克风。
  2. 采样频率:即每秒钟采用次数,44100 Hz是目前所有安卓设备都支持的采样频率。
  3. 声道数:表示声音由几个声道组成,单声道是目前所有安卓设备都支持的声道数。
  4. 量化精度:表示采用多少位二进制来表达一次量化的离散值,通常用 16 位。
  5. 缓冲区大小:表示在内存开辟一块多大的缓冲区用于存放硬件采集的音频数据。

构建 AudioRecord 的模板代码如下:

const val SOURCE = MediaRecorder.AudioSource.MIC //通过麦克风采集音频
const val SAMPLE_RATE = 44100 // 采样频率为 44100 Hz
const val CHANNEL_IN_MONO = AudioFormat.CHANNEL_IN_MONO // 单声道
const val ENCODING_PCM_16BIT = AudioFormat.ENCODING_PCM_16BIT //量化精度为 16 位

var bufferSize: Int = 0 // 音频缓冲区大小
val audioRecord by lazy {
// 计算缓冲区大小
bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_IN_MONO, ENCODING_PCM_16BIT)
// 构建 AudioRecord 实例
AudioRecord(SOURCE, SAMPLE_RATE, CHANNEL_IN_MONO, ENCODING_PCM_16BIT, bufferSize)
}

将构建 AudioRecord 的参数都常量化,以便在其他地方引用。其中缓冲区大小是通过AudioRecord.getMinBufferSize()动态计算的,计算的依据是采样平率、声道数、量化精度。

读取音频数据写入文件

有了 AudioRecord 实例,就可以调用它的方法文章来源地址https://www.toymoban.com/news/detail-408295.html

到了这里,关于Android 音频(一) _ 采样量化编码 & AudioRecord 录制音频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Android13音频录制适配

    之前写过一篇音频录制的文章,当时是在Android10以下的手机可以成功录制和播放,但是Android10及以上手机提示创建文件失败,最近做过Android13的适配,索性一起把之前的录音也适配了,记录一下适配的过程。 主要就是文件的生成和创建,由于Android10以后不能随意创建私有文件

    2024年02月21日
    浏览(32)
  • android 调用系统录制视频和音频

    1、录制视频 请先申请相机权限 2、录制音频 请先申请权限

    2023年04月08日
    浏览(27)
  • Android录制音频并使用ijkplayer播放

    在使用AudioRecorder时,需要了解采样率、频道配置和PCM音频格式数据的相关知识; PCM:音频的原始数据(AudioFormat.ENCODING_PCM_16BIT、AudioFormat.ENCODING_PCM_8BIT、AudioFormat.ENCODING_PCM_FLOAT等等);不同的PCM代表不同的位深 采样率:录音设备在单位时间内对模拟信号采样的多少,采样频

    2023年04月09日
    浏览(31)
  • Android14实战:打破音频默认重采样的限制(五十二)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 优质专栏: 多媒体系统工程师系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径

    2024年01月20日
    浏览(31)
  • 【音视频原理】音视频 “ 采样 - 编码 - 封装 过程 “ 和 “ 解封装 - 解码 - 播放 过程 “ 分析 ( 视频采集处理流程 | 音频采集处理流程 | 音视频文件解封装播放流程 )

    本篇文件主要分析 音视频文件 是怎么产生的 , 以及 音视频文件是如何播放的 ; 视频文件从录像到生成文件的全过程 : 采集图像帧 : 摄像头 硬件 负责 采集画面 , 采集的 初始画面 称为 \\\" 图像帧 \\\" , 一秒钟 采集 的 图像帧 数量 称为 \\\" 帧率 \\\" , 如 : 60 帧 就是 一秒钟采集 60 个画

    2024年02月11日
    浏览(51)
  • Android10 AudioRecord简单解析

    本文是对国科平台android10进行梳理,其它版本SDK可能有所差异,但总体框架是类似的 涉及源码路径: AudioRecord.java(frameworks/base/media/java/android/media/AudioRecord.java) android_media_AudioRecord.cpp(frameworks/base/core/jni/android_media_AudioRecord.cpp) AudioRecord.cpp(frameworks/av/media/libaudioclient/AudioRecord.cpp

    2023年04月09日
    浏览(46)
  • 如何进行音频录制?实用的音频录制方法合集

    音频录制是一种重要的技能,可以用于各种场合,比如我们可以使用音频录制技术录制不同乐器和声音的音频,并在后期进行处理和混音,制作出完整的音乐作品等等。但是,要想录制出高质量的音频并不容易,需要掌握一些专业的技巧和工具。 但随着互联网的不断发展,市

    2024年02月11日
    浏览(27)
  • 【FFmpeg】音视频录制 ① ( 查询系统中 ffmpeg 可录制的音视频输入设备 | 使用 ffmpeg 命令录制音视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频和视频数据命令 )

    在 Windows 系统中 , 使用 ffmpeg 命令 录制 音视频 , 需要先获取 系统的 音视频设备 信息 , 录制 音视频 本质上是从 系统音视频设备 中获取数据 ; 执行 命令 , 可以获取 系统中 ffmpeg 可用的 DirectShow 音视频输入设备 ; 命令参数解析 : -list_devices true : 列出所有 ffmpeg 的 指定类型的可

    2024年04月25日
    浏览(71)
  • Python音频处理,录制播放

    Simpleaudio:支持numpy数组播放 sounddevice 和 soundfile:支持播放和录制包含音频信号的 NumPy 数组 pydub:必须预先安装至少一个来自(simpleaudio、pyaudio、ffplay 和 avplay)的音频播放包。可以查看音频信息(时长,分贝) pyaudio 和 wave:录制和连续音频流 moviepy:视频音频剪辑处理 读取文

    2024年02月07日
    浏览(26)
  • AVFoundation - 音频录制

    需要调用到麦克风方法,别忘记添加 Privacy - Microphone Usage Description 伊织 2020-02-28

    2024年02月15日
    浏览(24)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包