iOS開發項目- 基於WebSocket的聊天通訊(2)_IOS

來源:互聯網
上載者:User

公司項目需要開發一個類似QQ、微信的即時IM聊天功能,做到即時監控訊息,需要用的技術是websocket,今天整理下語言聊天這塊;其實語言聊天,包含兩部分,錄音和音樂播放,關於簡單語言聊天功能如下圖:

錄音

在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;//如果要監控聲波則必須設定為YES    if (![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];  }}

點擊table 播放

- (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];  });}

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.