第五十一篇、录音
錄音
在AVFoundation框架中有一個AVAudioRecorder類專門處理錄音操作,它同樣支持多種音頻格式。與AVAudioPlayer類似,你完全可以將它看成是一個錄音機控制類,下面是常用的屬性和方法:
先來了解下AVAudioRecorder的常用屬性: @property (readonly, getter=isRecording) BOOL recording;//是否正在錄音 @property (readonly) NSDictionary<NSString *, id> *settings;//錄音配置 @property (readonly) NSURL *url;//錄音文件存放URL @property (readonly) NSTimeInterval currentTime;//錄音時長 @property (getter=isMeteringEnabled) BOOL meteringEnabled;//是否監控聲波 常用對象方法: - (BOOL)prepareToRecord;//為錄音準備緩沖區 - (BOOL)record;//錄音開始,暫停后調用會恢復錄音 - (BOOL)recordAtTime:(NSTimeInterval)time;//在指定時間后開始錄音 - (BOOL)recordForDuration:(NSTimeInterval) duration;//按指定時長錄音 - (BOOL)recordAtTime:(NSTimeInterval)time forDuration:(NSTimeInterval)duration;//上面2個的合體 - (void)pause; //中斷錄音 - (void)stop; //停止錄音 - (BOOL)deleteRecording;//刪除錄音,必須先停止錄音再刪除 常用的代理方法: //錄音完成后調用 - (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag;//錄音編碼發送錯誤時調用 - (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error;?
音頻
如果播放較大的音頻或者要對音頻有精確的控制則System Sound Service可能就很難滿足實際需求了,通常這種情況會選擇使用AVFoundation.framework中的AVAudioPlayer來實現。AVAudioPlayer可以看成一個播放器,它支持多種音頻格式,而且能夠進行進度、音量、播放速度等控制
AVAudioPlayer的使用比較簡單:1.初始化AVAudioPlayer對象,此時通常指定本地文件路徑。2.設置播放器屬性,例如重復次數、音量大小等。3.調用play方法播放。?
具體實現:
#import <AVFoundation/AVFoundation.h> #define kRecordAudioFile @"myRecord.caf"@interface ViewController ()<AVAudioRecorderDelegate> {NSString *dateName;} @property (weak, nonatomic) IBOutlet UITableView *table;@property (nonatomic,strong) AVAudioRecorder *audioRecorder;//音頻錄音機 @property (nonatomic,strong) AVAudioPlayer *audioPlayer;//音頻播放器,用于播放錄音文件 @property(nonatomic,strong) NSMutableArray *spaceData;@end@implementation ViewController #pragma mark - 私有方法 /*** 設置音頻會話*/ -(void)setAudioSession{AVAudioSession *audioSession=[AVAudioSession sharedInstance];//設置為播放和錄音狀態,以便可以在錄制完之后播放錄音 [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];[audioSession setActive:YES error:nil]; }/*** 取得錄音文件設置** @return 錄音設置*/ -(NSDictionary *)getAudioSetting{NSMutableDictionary *dicM=[NSMutableDictionary dictionary];//設置錄音格式 [dicM setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];//設置錄音采樣率,8000是電話采樣率,對于一般錄音已經夠了[dicM setObject:@(8000) forKey:AVSampleRateKey];//設置通道,這里采用單聲道[dicM setObject:@(1) forKey:AVNumberOfChannelsKey];//每個采樣點位數,分為8、16、24、32[dicM setObject:@(8) forKey:AVLinearPCMBitDepthKey];//是否使用浮點數采樣 [dicM setObject:@(YES) forKey:AVLinearPCMIsFloatKey];//....其他設置等return dicM; } /*** 取得錄音文件保存路徑** @return 錄音文件路徑*/ -(NSURL *)getPlayPath:(NSString *)title{// static int index = 0; NSString *urlStr=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];urlStr=[urlStr stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%@",title,kRecordAudioFile]];NSLog(@"play file path:%@",urlStr);NSURL *url=[NSURL fileURLWithPath:urlStr];return url; }/*** 以日期為title,來保存錄音** @return <#return value description#>*/ - (NSString *) convertDateFromString {NSDate *date = [NSDate date];// NSLog(@"%@--askl",date);// NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //zzz表示時區,zzz可以刪除,這樣返回的日期字符將不包含時區信息。 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];NSString *destDateString = [dateFormatter stringFromDate:date];return destDateString;}?
長按開始錄音,松開停止:
- (void)setClikeSpaceState:(NSString *)aState {NSLog(@"點擊語音---"); if([aState isEqualToString:@"begin"]){NSLog(@"begin---");dateName = [self convertDateFromString];//創建錄音文件保存路徑NSURL *url=[self getPlayPath:dateName];//創建錄音格式設置NSDictionary *setting=[self getAudioSetting];//創建錄音機NSError *error=nil;_audioRecorder=[[AVAudioRecorder alloc]initWithURL:url settings:setting error:&error];_audioRecorder.delegate=self;_audioRecorder.meteringEnabled=YES;//如果要監控聲波則必須設置為YESif (![self.audioRecorder isRecording]) {[self.audioRecorder record];//首次使用應用時如果調用record方法會詢問用戶是否允許使用麥克風// self.timer.fireDate=[NSDate distantPast]; NSLog(@"111");}}else{NSLog(@"end---");/** 停止錄音*/[self.audioRecorder stop];/** 錄音地址*/NSURL *url = [self getPlayPath:dateName];/** 加載數據*/AVAudioPlayer *audioPlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];Model *model = [[Model alloc]init];model.duration = [NSString stringWithFormat:@"%.f",audioPlayer1.duration];model.spacePath = dateName;/** table 刷新*/[self.spaceData addObject:model];[self.table reloadData];/** table 滾動到當前row*/[self.table selectRowAtIndexPath:[NSIndexPath indexPathForRow:(self.spaceData.count - 1) inSection:0] animated:YES scrollPosition:UITableViewScrollPositionTop];} }?
點擊播放:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{Model *model = self.spaceData[indexPath.row]; /** 播放錄音*/NSURL *url=[self getPlayPath:model.spacePath];NSError *error=nil;_audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];_audioPlayer.numberOfLoops=0;[_audioPlayer prepareToPlay];[self.audioPlayer play];NSLog(@"%.0f---aaaa",_audioPlayer.duration);/** UIImage動畫數組*/NSMutableArray *imgData = [NSMutableArray array];for(int i=0;i<4;i++){UIImage *aImage = [UIImage imageNamed:[NSString stringWithFormat:@"chat_receiver_audio_playing00%d",i]];[imgData addObject:aImage];}TwoTableViewCell *twoCell = [self.table cellForRowAtIndexPath:indexPath];/** 點擊動畫*/[twoCell.speak setAnimationImages:imgData];// [twoCell.speak setAnimationRepeatCount:1];[twoCell.speak setAnimationDuration:1];[twoCell.speak startAnimating];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)([model.duration intValue] * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[twoCell.speak stopAnimating];});}?
轉載于:https://www.cnblogs.com/HJQ2016/p/5952907.html
總結
- 上一篇: 使用sql语句,查询 mysql 的安装
- 下一篇: IDEA上安装和使用checkstyle