问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何采集一帧音频

发布网友 发布时间:2022-04-22 17:06

我来回答

2个回答

好二三四 时间:2022-09-21 03:50

采集音频信号的方法:

从电脑的音频输出口采集并送往外部录音或扩大设备,一定要将信号先衰减,典型做法是在输出线路中串联一只10K欧的电阻。凡是从耳机输出口采集信号的原则上都要衰减,否则录音电平过高会严重失真,凡是从音频线路输出口采集的信号则是标准的录音电平,无需衰减。

热心网友 时间:2023-11-10 04:55

本文重点关注如何在Android平台上采集一帧音频数据。阅读本文之前,建议先读一下我的上一篇文章《Android音频开发(1):基础知识》,因为音频开发过程中,经常要涉及到这些基础知识,掌握了这些重要的概念后,开发过程中的很多参数和流程就会更加容易理解。
Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风录入的音频数据进行编码压缩(如AMR、MP3等)并存成文件,而后者则更接近底层,能够更加自由灵活地控制,可以得到原始的一帧帧PCM音频数据。

如果想简单地做一个录音机,录制成音频文件,则推荐使用 MediaRecorder,而如果需要对音频做进一步的算法处理、或者采用第三方的编码库进行压缩、以及网络传输等应用,则建议使用 AudioRecord,其实 MediaRecorder 底层也是调用了 AudioRecord 与 Android Framework 层的 AudioFlinger 进行交互的。

音频的开发,更广泛地应用不仅仅局限于本地录音,因此,我们需要重点掌握如何利用更加底层的 AudioRecord API 来采集音频数据(注意,使用它采集到的音频数据是原始的PCM格式,想压缩为mp3,aac等格式的话,还需要专门调用编码器进行编码)。

1. AudioRecord 的工作流程

首先,我们了解一下 AudioRecord 的工作流程:

(1) 配置参数,初始化内部的音频缓冲区

(2) 开始采集
(3) 需要一个线程,不断地从 AudioRecord 的缓冲区将音频数据“读”出来,注意,这个过程一定要及时,否则就会出现“overrun”的错误,该错误在音频开发中比较常见,意味着应用层没有及时地“取走”音频数据,导致内部的音频缓冲区溢出。
(4) 停止采集,释放资源
2. AudioRecord 的参数配置

上面是 AudioRecord 的构造函数,我们可以发现,它主要是靠构造函数来配置采集参数的,下面我们来一一解释这些参数的含义(建议对照着我的上一篇文章来理解):

(1) audioSource

该参数指的是音频采集的输入源,可选的值以常量的形式定义在 MediaRecorder.AudioSource 类中,常用的值包括:DEFAULT(默认),VOICE_RECOGNITION(用于语音识别,等同于DEFAULT),MIC(由手机麦克风输入),VOICE_COMMUNICATION(用于VoIP应用)等等。

(2) sampleRateInHz

采样率,注意,目前44100Hz是唯一可以保证兼容所有Android手机的采样率。

(3) channelConfig

通道数的配置,可选的值以常量的形式定义在 AudioFormat 类中,常用的是 CHANNEL_IN_MONO(单通道),CHANNEL_IN_STEREO(双通道)

(4) audioFormat

这个参数是用来配置“数据位宽”的,可选的值也是以常量的形式定义在 AudioFormat 类中,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),注意,前者是可以保证兼容所有Android手机的。

(5) bufferSizeInBytes

这个是最难理解又最重要的一个参数,它配置的是 AudioRecord 内部的音频缓冲区的大小,该缓冲区的值不能低于一帧“音频帧”(Frame)的大小,而前一篇文章介绍过,一帧音频帧的大小计算如下:

int size = 采样率 x 位宽 x 采样时间 x 通道数
采样时间一般取 2.5ms~120ms 之间,由厂商或者具体的应用决定,我们其实可以推断,每一帧的采样时间取得越短,产生的延时就应该会越小,当然,碎片化的数据也就会越多。

在Android开发中,AudioRecord 类提供了一个帮助你确定这个 bufferSizeInBytes 的函数,原型如下:

int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat);
不同的厂商的底层实现是不一样的,但无外乎就是根据上面的计算公式得到一帧的大小,音频缓冲区的大小则必须是一帧大小的2~N倍,有兴趣的朋友可以继续深入源码探究探究。

实际开发中,强烈建议由该函数计算出需要传入的 bufferSizeInBytes,而不是自己手动计算。

3. 音频的采集线程

当创建好了 AudioRecord 对象之后,就可以开始进行音频数据的采集了,通过下面两个函数控制采集的开始/停止:

AudioRecord.startRecording();
AudioRecord.stop();
一旦开始采集,必须通过线程循环尽快取走音频,否则系统会出现 overrun,调用的读取数据的接口是:

AudioRecord.read(byte[] audioData, int offsetInBytes, int sizeInBytes);

热心网友 时间:2023-11-10 04:56

  采集音频信号有多种方法,如果从电脑的音频输出口采集并送往外部录音或扩大设备,一定要将信号先衰减,典型做法是在输出线路中串联一只10K欧的电阻。
  凡是从耳机输出口采集信号的原则上都要衰减,否则录音电平过高会严重失真,凡是从音频线路输出口采集的信号则是标准的录音电平,无需衰减。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
imba里能抽到什么好装备 DOTA IMBA神器抽奖抽到几率和大野爆的几率。还有小鸡无限眼的BUG能不能... 《魔兽世界》怀旧服玩具获取方法 求最好的手机杀毒软件 手机杀毒软件哪个好用 2023年最旺女孩名字有草有水296个 我的世界红石电梯怎么制作 怎么用微信申请微信号? 有些网页不能复制,可我想要复制下来,该怎么弄啊? 电脑网址怎么保存电脑怎么收藏网址 怎么办,还是最想去土耳其? 深度学习在语音识别方面主要的难题和困难是什么? 语音识别怎么设置? 声纹识别与语音识别的区别? 市面上谁家语音识别处理的最好? 语音识别领域的最新进展目前是什么样的水准? 语音采集发展史 为什么现在的很多软件都可以带人脸识别、语音识别功能,而原来没有。 分户口采集语音识别做什么? 语音识别是怎么样进行数据采集的 数据堂语音识别数据采集的话,能采集哪些语种? pm2.5污染等级划分是怎样的? pm2.5室内标准是什么? 雾霾pm2.5主要的来源有哪些 网上申报和报税是一个意思吗 404 Not Found 网上申报的申报形式 “增”的拼音是什么? 网上申报 显示您未认定申报的税种,请与所属税务机关联系 是什么意思怎么解决 什么是网上报税? 网上报税,报的都是哪些税啊,要提交哪些报表? 非特定人语音识别的简介 语音控制功能的原理 鏈夐┈娑﹀湪灏辫屼簡锛屾垜浠鍦ㄤ笉鍦ㄦ剰涔変笉澶是什么字 杯子水里为什么有气泡? 水杯内壁有气泡能喝吗 有什么杯子是可以喝气泡水的啊? 水杯底部各代表什么 冒起气泡的水杯 水杯里为什么会有小气泡 杯子里面的水放多久不可以喝了? 最近爱上了气泡水,但是听说吸管杯不能喝气泡水,开盖的时候会喷出来,真的吗? 为什么气泡附在水杯壁上而不是在中间 物理杯子气泡 水杯气泡 怎样做简单又漂亮的小动物小手工 世界上都有什么小动物橡皮泥版 幼儿手工制作石榴小动物 请看黑板.英语怎么写 请看黑板 我翻译是Plase look blackboard 正确的应该是什么? 看黑板用英语怎么表达