Android音频基础与录制播放

一、音频概览

声音是振动产生的能量(声波),通过介质传播并能被人或动物听觉器官所感知的波动现象。例如人类说话时通过声带振动产生声波,通过空气传播后到达其他人耳朵。

要采集声音,就需要通过麦克风对声音进行录制。录音就是将声音转为模拟信号或机械记录的过程。而数字录音是进一步将模拟信号经由ADC(模拟数字转换器)将类比取样成数字记录到存储设备。

Android开发音频,就是利用AudioRecoderMediaRecoder录音,通过AudioTrackMediaPlayer播放声音,而这一过程会涉及到很多知识点,例如录制声音过程的采样率、位深、编解码MediaCodecFFmpeg等等。

总结来说:

  1. 音频录制与播放(Android相关类的使用,Framework调用原理)
  2. 音频处理(去噪、静音检测、回声消除、音效处理、功放/增强、混音分离)
  3. 音频的编解码和格式转换(MediaCodecFFmpeg
  4. 音频传输协议(SIP\A2DPAVRCP等)

1、PCM

PCM全名叫脉冲编码调制,是一种将模拟信号数字化的方法。PCM将信号的强度依照同样的间距分成数段,然后使用独特的数字记号(二进制)量化。这一过程通常由ADC来实现。作为Android程序员,更多是调用AudioTrack录制音频后,保存为PCM编码格式,也可以再进一步编码,存储成其它格式。

例如下图(正常应该是正弦波):

用绿色圆圈来表示连续的模拟信号,而红色圆点则表示数字信号。PCM过程就是在模拟信号上进行采样和收集,形成断断续续的采样点,也就是数字信号。在X轴方向上,可以理解为对音频的量化是时间,体现在采样率上。在Y轴方向,可以理解为量化是数量,体现为位深。
 

2、采样率

采样率表示在1秒内对声音的模拟信号采样的次数,假设上面是声音在1秒内的模拟信号,那么采样就只有2次,以频率作为计量单位,所以这里采样率2Hz。由此 ,可以看出采样率越高,采样得到的数字信号数据就越多,声音在播放过程就会越真实越接近原声,但这也占用很大的数据存储。所以需要根据人耳能识别频率的范围和具体的使用场景,将采样率控制在合适的范围内。常用的音频采样率为44.1k Hz48k Hz

人耳能识别的频率在20~20kHz,根据奈奎斯特·香农采样定理,采样后的音频要还原成人耳可以识别声音,采样率需要为人耳可以识别频率的2倍,而人耳上限是20KHz,2倍就是

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想使用Android的AudioRecorder录制音频,并在蓝牙音箱上播放,请按照以下步骤操作: 1. 配置和准备录音器 创建`AudioRecorder`对象,设置音频源、采样率、声道数、编码格式等参数,并调用`prepare()`方法准备录音器。 2. 启动录音 调用`start()`方法开始录音。录音期间,将蓝牙音箱连接到Android设备,并将其设置为音频输出源。 3. 播放录制音频 录音完成后,您可以使用`MediaPlayer`对象加载和播放录制音频文件。在播放期间,音频将通过蓝牙音箱进行输出。 下面是一个简单的示例代码: ``` private AudioRecorder audioRecorder; private MediaPlayer mediaPlayer; private void startRecordingAndPlayback() { audioRecorder = new AudioRecorder(); audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); audioRecorder.setAudioSamplingRate(44100); audioRecorder.setAudioChannels(2); audioRecorder.setOutputFile(getFilePath()); // 设置音频文件保存路径 try { audioRecorder.prepare(); audioRecorder.start(); } catch (Exception e) { e.printStackTrace(); } mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(getFilePath()); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.prepare(); mediaPlayer.start(); } private void stopRecordingAndPlayback() { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } if (audioRecorder != null) { audioRecorder.stop(); audioRecorder.release(); audioRecorder = null; } } ``` 请注意,这只是一个基本示例。您可能需要根据自己的需求进行更改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值