1、相关API
声音采集:
MediaRecorder:直接录制成文件,并保存起来。使用方便
AudioRecord:直接把声音实时的字节数据返还给我们。使用复杂但是灵活
声音播放:
MediaPlayer:提供基于声音文件播放的API(提供文件或路径)。使用方便
AudioTrack:提供基于字节数据播放的API。使用灵活
多线程:****
ExecutorService
--使用简单,功能强大
--内置各种线程组,线程池。


2.数据传输:
基于文件:HTTP文件上传下载。
基于字节流:TCP/WebSocket 长连接的方式

3.多线程问题
--防止阻塞主线程,提高APP响应能力
--主线程和后台线程状态同步
--录音JNI函数不能多线程调用,避免闪退。所以ExecutorService用的单线程的线程池。
    mediaRecorder:prepare, start,stop,reset, release...
    audioRecord:startRecording, read, stop, release...

4.关键参数分析
setAudioSource
*麦克风:MediaRecorder.AudioSource.MIC
*语音识别:VOICE_RECOGNITION
*语音通话:VOICE_COMMUNICATION

setOutputFormat / setAudioEncoder
*文件的容器:MediaRecorder.OutputFormat.MPEG_4
*声音的编码:MediaRecorder.AudioEncoder.ACC

setAudioSamplingRate
*说话声音是模拟信号,需要转换成数字信号
*采样频率越高,数据越大,音质越好。
*常用频率:8kHz、11.025kHz、22.05kHz、16kHz、
37.8kHz、44.1kHz、48kHz、96kHz、192kHz

setAudioEncodingBitRate
*声音编码:码率越大,压缩越小,音质越好
*AAC HE(High Efficiency):32kbps-96kbps,码率低,音质一般。
*AAC LC(Low Complexity):96kbps-192kbps,平衡低码率和高音质。

4.2 字节流模式
channelConfig:
*音频的采集和播放可以叠加
*同时从多个音频源采集,分别输出到不同的扬声器。
*单声道(Mono)和双声道(Stereo)比较常见

audioFormat
* 量化精度:原始PCM数据,每个采样点的数据大小
* 4bit、8、16、32...位数越多,音质越好,数据越大。
* 16bit兼容所有安卓手机

=================================

5.播放过程多线程和关键参数
* volatile 保证主线程的修改后台线程可见。
* 字节流模式要循环读写数据,必须在后台线程。
* 避免播放JNI函数的闪退,所以只用一个后台线程,不能用多个后台线程。
    A/libc:Fatal signal 11(SIGSEGV) at 0x00000010(code=1),thread 9302
* MediaPlayer: prepare,start,stop,reset,release.
* AudioTrack:play, write, stop, release.

6.文件模式播放的代码
// 设置声音文件
mMediaPlayer.setDataSource(audioFile.getAbsolutePath());
// 配置音量,是否循环
mMediaPlayer.setVolumn(1,1); // 范围0~1
mMediaPlayer.setLooping(false);
// 准备,开始
mMediaPlayer.prepare();
mMediaPlayer.start();

7.字节流模式播放的代码

流模式:AudioTrack.MODE_STREAM
    源源不断把数据,调用write函数,写到native层去
静态模式:AudioTrack.MODE_STATIC
    调用play之前,先一次性把所有的数据都写到native层,一次性完成数据传输。

 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐