iOS和安卓录音的兼容问题解决

前言

最近做项目, 涉及到录音, 刚开始自测完全没问题, 也就没考虑那么多, 直到测试人员介入测试, 最后发现了问题, 那就是安卓的录音和iOS的录音不兼容, 具体就是安卓可以播放iOS的录音, iOS播放不了安卓的录音, 放出来都是滋滋啦啦的杂音, 由于对录音等方面的知识欠缺, 被搞的焦头烂额, 最后发现了问题, 也补充了一些录音方面的知识!

从安卓和iOS诞生起, 谷歌和苹果两家巨头公司就相爱相杀, iOS和安卓各种不兼容, 坑了我们广大程序猿!

安卓开发文档上面说明了安卓支持的音频格式, 其中包括:AAC, AAC+, AMR-NB, AMR-WB, FLAC, MIDI, MP3, Opus, PCM/WAVE, Vorbis等;

苹果开发文档 上面说明了iOS支持的音频格式, 包括AAC, AC3, AIFC, AIFF, WAVE, MPEG等;

综上, 只能用ACC兼容两者, 特别需要安卓同事注意;

安卓代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mRecorder = new MediaRecorder();

// 设置输出文件
mRecorder.setOutputFile(file.getAbsolutePath());

// 设置meidaRecorder的音频源是麦克风
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

// 设置文件音频的输出格式为amr
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);

//跟ios 保持同步
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

//通道
mRecorder.setAudioChannels(1);
//比特率
mRecorder.setAudioEncodingBitRate(16);
//采样率
mRecorder.setAudioSamplingRate(8000);

// 严格遵守google官方api给出的mediaRecorder的状态流程图
mRecorder.prepare();
mRecorder.start();

iOS代码

1
2
3
4
5
6
7
8
9
NSDictionary *recordSetting = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
[NSNumber numberWithFloat:8000.00], AVSampleRateKey,
[NSNumber numberWithInt:1], AVNumberOfChannelsKey,
[NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,
nil];

注意: 两端参数一定要一致! 一致! 一致! 重要的事情说三遍;

采样率
比特率
声音通道等参数一定要设置成一样的!

另外, AMR格式有两种, 一种是AMR-NB, 一种是AMR-WB, 这里一定要和iOS同步;

看到这就是真爱,打个赏呗~