安卓声音采集,调研(文件模式,字节流模式)
1、相关API声音采集:MediaRecorder:直接录制成文件,并保存起来。使用方便AudioRecord:直接把声音实时的字节数据返还给我们。使用复杂但是灵活声音播放:MediaPlayer:提供基于声音文件播放的API(提供文件或路径)。使用方便AudioTrack:提供基于字节数据播放的API。使用灵活多线程:****ExecutorService--使用简单,功能...
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层,一次性完成数据传输。
更多推荐
所有评论(0)