iOS 仿微信发送语音消息按钮 - 语音播放器(三)

#Part 3 :语音播放器
Part 2 中的录音机录制完成,并把amr文件的data通过服务器发送给对方,对方收到后无法直接使用这个data进行播放,需要转换成wav格式data.

  • 与part 2相同,也创建两个音频文件到沙盒的Tmp文件夹中
NSString *wavPlayerFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"WAVtemporaryPlayer.wav"];
NSString *amrPlayerFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"AMRtemporaryPlayer.amr"];
复制代码
  • 转换amr格式data,成为wav格式data
- (NSData *)conversionAMRDataToWAVData:(NSData *)amrData
{
    NSString *wavPlayerFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"WAVtemporaryPlayer.wav"];
    NSString *amrPlayerFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"AMRtemporaryPlayer.amr"];
    
    //amr的data写入文件
    [amrData writeToFile:amrPlayerFilePath atomically:YES];
    //将AMR文件转码成WAVE文件
    amr_file_to_wave_file([amrPlayerFilePath cStringUsingEncoding:NSUTF8StringEncoding],
                          [wavPlayerFilePath cStringUsingEncoding:NSUTF8StringEncoding]);

    //得到转码后wav的data
    return [NSData dataWithContentsOfFile:wavPlayerFilePath];
}
复制代码
  • 使用initWithData:(NSData *)data error:(NSError **)outError方法初始化播放器
self.audioPlayer = [[AVAudioPlayer alloc]initWithData:[self conversionAMRDataToWAVData:data] error:nil];
self.audioPlayer.meteringEnabled = YES;
self.audioPlayer.delegate = self;
self.audioPlayer.volume = 1.0;
self.audioPlayer.numberOfLoops = 0;
[self.audioPlayer prepareToPlay];
[self.audioPlayer play];
复制代码
  • 播放完成代理方法中做一些事情
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    if (flag) {//播放完成
        [self stopPlaying];
        if (self.finished) {
            self.finished();
        }
    }
} 
复制代码
  • 开启关闭红外传感器,当耳朵贴近屏幕时用听筒播放,当离开是用扬声器播放
//监听红外传感器改变通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange) name:UIDeviceProximityStateDidChangeNotification object:nil];
//开始播放时开启红外传感器
[[UIDevice currentDevice] setProximityMonitoringEnabled:NO];
//结束播放时关闭红外传感器
[UIDevice currentDevice].proximityMonitoringEnabled = YES;

- (void)proximityStateDidChange
{
    if ([UIDevice currentDevice].proximityState) {
        NSLog(@"有物品靠近");
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    } else {
        NSLog(@"有物品离开");
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    }
}
复制代码

Demo 地址 :github.com/XL-Andrew/C…

转载于:https://juejin.im/post/5a322061f265da431048664d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值