ios语音通讯解决方案 wav转amr

最近在倒腾语音,遇到一些问题,再次记录一下,方便日后使用。

        0.ios录制。

1.ios录制语音转化为 amr格式,至于为什么用amr,就不在此赘述了。

2.在静音状态下播放语音。

3.播放过后,整体音量变小。

4.听筒播放和喇叭播放切换。

1.ios录制

使用AVAudioRecorder, 即可完成录音操作。

        NSString* pcm_path = @”路径“;
        _recordedTmpFile = [[NSURL alloc] initFileURLWithPath:pcm_path];
        //LinearPCM 是iOS的一种无损编码格式,但是体积较为庞大
        //录音设置
        NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];
        //录音格式 无法使用
        [recordSettings setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey: AVFormatIDKey];
        //采样率
        [recordSettings setValue :[NSNumber numberWithFloat:8000.0] forKey: AVSampleRateKey];//44100.0
        //通道数
        [recordSettings setValue :[NSNumber numberWithInt:1] forKey: AVNumberOfChannelsKey];
        //线性采样位数
        //[recordSettings setValue :[NSNumber numberWithInt:16] forKey: AVLinearPCMBitDepthKey];
        //音频质量,采样质量
        [recordSettings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
        
        //Setup the recorder to use this file and record to it.
        _recorder = [[ AVAudioRecorder alloc] initWithURL:_recordedTmpFile settings:recordSettings error:nil];
        _recorder.delegate = self;
        _recorderTime = 0.0f;
    [_recorder prepareToRecord];
    [_recorder record];


2.格式转换。

此处主要使用ibopencore-amr库(Go)。下载下来进行编译,编译脚本网上也可以找到。此处提供懒人模式,密码: 89py。
文件编译好过后,正常导入使用即可。
在使用过成功遇到的一个问题就是。安卓录制的是非amr文件,导致转码失败。此时在读取需要转码文件的时候,看看文件的头部。是不是“

#!AMR\n”。

使用方法:直接调用amrFileCodec.h下面的

EncodeWAVEFileToAMRFile,  

DecodeAMRFileToWAVEFile就可以进行转码了。

3.用户静音状态下播放

//不会停止其他程序播放,当设备设置为静音时,无法播放。锁屏会停止播放
NSString * const AVAudioSessionCategoryAmbient = @"AVAudioSessionCategoryAmbient";
//停止其他程序播放,当设备设置为静音时,
NSString *const AVAudioSessionCategorySoloAmbient = @"AVAudioSessionCategorySoloAmbient";
//停止播放其他程序音频,设备设置为静音的时候,音频依然会继续播放。
NSString *const AVAudioSessionCategoryPlayback = @"AVAudioSessionCategoryPlayback";
//只能进行录音
NSString *const AVAudioSessionCategoryRecord = @"AVAudioSessionCategoryRecord";
//同时进行录音和播放
NSString *const AVAudioSessionCategoryPlayAndRecord = @"AVAudioSessionCategoryPlayAndRecord";
//音频处理,不能进行录制和播放
NSString *const AVAudioSessionCategoryAudioProcessing = @"AVAudioSessionCategoryAudioProcessing";
    AVAudioSession * audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: nil];

可以根据实际情况,选择合适自己的。


4.音量

此处需要设置一下,可能会出现音量变小的问题。
	AVAudioSession * audioSession = [AVAudioSession sharedInstance];
    [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];


5.听筒和喇叭的切换

需要监听听筒旁边的设备,当设备被挡住时,也就是在接听电话状态。

[[UIDevice currentDevice] setProximityMonitoringEnabled:YES];
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(senderStateChange:)
 name:@"UIDeviceProximityStateDidChangeNotification" 
error:nil];

- (void)senderStateChange:(NSNotificationCenter*)not
{
    if ([[UIDevice currentDevice] proximityState] == YES)
    {
        NSLog(@"Device is close to user");
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
        
    }
    else
    {
        NSLog(@"Device is not close to user");
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
        
    }
}



后记:
下载中有.cpp文件,可以把文件改成点.m。都是c语言的语法。或者是把引用该文件的文件名改成.mm。
最后是需要把自己的语音上传后台,然后再下载下来进行播放即可。
为了避免广告嫌疑,自己找找。有第三方平台,可以上传第三方,然后在下载下来播放。这样自己的后台工作量就简单多了。

发布了59 篇原创文章 · 获赞 2 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览