Part 3 :語音播放器
Part 2 中的錄音機錄制完成,并把amr
文件的data通過服務(wù)器發(fā)送給對方,對方收到后無法直接使用這個data進行播放,需要轉(zhuǎn)換成wav
格式data.
- 與part 2相同,也創(chuàng)建兩個音頻文件到沙盒的Tmp文件夾中
NSString *wavPlayerFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"WAVtemporaryPlayer.wav"];
NSString *amrPlayerFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"AMRtemporaryPlayer.amr"];
- 轉(zhuǎn)換
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文件轉(zhuǎn)碼成WAVE文件
amr_file_to_wave_file([amrPlayerFilePath cStringUsingEncoding:NSUTF8StringEncoding],
[wavPlayerFilePath cStringUsingEncoding:NSUTF8StringEncoding]);
//得到轉(zhuǎn)碼后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();
}
}
}
- 開啟關(guān)閉紅外傳感器,當耳朵貼近屏幕時用聽筒播放,當離開是用揚聲器播放
//監(jiān)聽紅外傳感器改變通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange) name:UIDeviceProximityStateDidChangeNotification object:nil];
//開始播放時開啟紅外傳感器
[[UIDevice currentDevice] setProximityMonitoringEnabled:NO];
//結(jié)束播放時關(guān)閉紅外傳感器
[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 地址 :https://github.com/XL-Andrew/ChatToolBarAudioButton