美文网首页视频开发iOS Developer
iOS 仿微信发送语音消息按钮 - 语音录音机(二)

iOS 仿微信发送语音消息按钮 - 语音录音机(二)

作者: 我就叫Tom怎么了 | 来源:发表于2017-07-19 15:52 被阅读831次

Part 2 :语音录音机

其实网上很多录音的文章,这里主要说明的是网络传输音频相关的内容.

基本流程就是录音结束后获取一个wav格式的录音,转换为amr格式文件,转成NSData格式,用于传输.

amr格式的文件大小是wav格式文件大小的十分之一左右,更适合传输.

  • 先创建两个音频文件到沙盒的Tmp文件夹中(Tmp存储临时数据,iCloud 不会备份这些文件)
//创建缓存录音文件到Tmp
NSString *wavRecordFilePath = [NSTemporaryDirectory()stringByAppendingPathComponent:@"WAVtemporaryRadio.wav"];
NSString *amrRecordFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"AMRtemporaryRadio.amr"];

if (![[NSFileManager defaultManager]fileExistsAtPath:wavRecordFilePath]) {
    [[NSData data] writeToFile:wavRecordFilePath atomically:YES];
}
if (![[NSFileManager defaultManager]fileExistsAtPath:amrRecordFilePath]) {
    [[NSData data] writeToFile:amrRecordFilePath atomically:YES];
}

WAVtemporaryRadio.wav文件是录音后的临时存储文件
AMRtemporaryRadio.amr文件是用于网络传输的文件

  • 懒加载AVAudioRecorder
- (AVAudioRecorder *)audioRecorder
{
    if (!_audioRecorder) {
        //暂存录音文件路径
        NSString *wavRecordFilePath = [NSTemporaryDirectory()stringByAppendingPathComponent:@"WAVtemporaryRadio.wav"];
        
        NSDictionary *recordSetting = @{ AVSampleRateKey        : @8000.0,                      // 采样率
                                         AVFormatIDKey          : @(kAudioFormatLinearPCM),     // 音频格式
                                         AVLinearPCMBitDepthKey : @16,                          // 采样位数 默认 16
                                         AVNumberOfChannelsKey  : @1                            // 通道的数目
                                         };
        
        _audioRecorder = [[AVAudioRecorder alloc] initWithURL:[NSURL URLWithString:wavRecordFilePath] settings:recordSetting error:nil];
        _audioRecorder.delegate = self;
        _audioRecorder.meteringEnabled = YES;
    }
    return _audioRecorder;
}
  • 开始录音
[self.audioRecorder prepareToRecord];
[self.audioRecorder record];
  • 开启音频值测量
double lowPassResults = pow(10, (0.05 * [_self->_audioRecorder peakPowerForChannel:0]));
  • 完成录音后,会进入到AVAudioRecorder的代理方法中,(wave_file_to_amr_file类demo中会有)
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
    //暂存录音文件路径
    NSString *wavRecordFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"WAVtemporaryRadio.wav"];
    NSString *amrRecordFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"AMRtemporaryRadio.amr"];
    
    //重点:把wav录音文件转换成amr文件,用于网络传输.amr文件大小是wav文件的十分之一左右
    wave_file_to_amr_file([wavRecordFilePath cStringUsingEncoding:NSUTF8StringEncoding],[amrRecordFilePath cStringUsingEncoding:NSUTF8StringEncoding], 1, 16);
    
    //返回amr音频文件Data,用于传输或存储
    NSData *cacheAudioData = [NSData dataWithContentsOfFile:amrRecordFilePath];
    if ([self.delegate respondsToSelector:@selector(audioRecorderDidFinishRecordingWithData:)]) {
        [self.delegate audioRecorderDidFinishRecordingWithData:cacheAudioData];
    }
}

Demo 地址 :https://github.com/XL-Andrew/ChatToolBarAudioButton

相关文章

网友评论

  • MrJ的杂货铺:加了distimer文件后就报错
    我就叫Tom怎么了:@MrJ的杂货铺 :joy:
    MrJ的杂货铺:解决了,不是这个问题,是引入.c文件的原因
    我就叫Tom怎么了:什么错误内容?是不是你文件重复?
  • thls:楼主,关于转码的部分能讲讲么,直接用你的代码感觉转码有杂音那些
  • 你大赟哥:请问一下,我也将你的代码拖入工程了,也报错了,不知道怎么解决,请问应该怎么修改呢?
    我就叫Tom怎么了:嗯,报的什么错呢?
  • 卓敦:楼主,为什么那个播放网络amr的方法,我点击不同cell提供的URL是不同的,为什么播放的语音都是同一条
    我就叫Tom怎么了:@卓敦 - (void)startPlayWithURL:这个方法自带播放功能的,你是怎么调用的?
    卓敦:@我就叫Tom怎么了 我修改了,我是先下载再播放,再次播放会判断是否存在
    我就叫Tom怎么了:这可能是一个问题,我大致想了一下可能是录音文件循环使用造成的问题。后续我会测试修改,近期公司还是很忙:joy:
  • 卓敦:楼主,这个录音完成之后怎么获得我刚刚录音的文件
    卓敦:@我就叫Tom怎么了 嗯嗯,录音完成之后要上传,然后下次进来获取同一个录音的时候要从缓存拿,就不用去在线听了
    我就叫Tom怎么了:没有提供这个功能,我猜你的业务逻辑是要上传语音文件吧?
  • LSLloveJS:你好,请问导入你的文件到项目后,老是报错。但是运行你的项目是没有错的,请问需要导入什么库文件吗
    LSLloveJS:@我就叫Tom怎么了 上面没法发图片
    LSLloveJS:@我就叫Tom怎么了 我的QQ:1475278509@qq.com,可以加我QQ方便沟通吗?
    我就叫Tom怎么了:报的什么错?贴一下出来看看

本文标题:iOS 仿微信发送语音消息按钮 - 语音录音机(二)

本文链接:https://www.haomeiwen.com/subject/xeulkxtx.html