標籤:des class code tar get int
ios xmpp 發送語音,圖片解決方案,有需要的朋友可以參考下。
目前做IM多是用的xmpp。
因為項目需求需要實現語音和圖片的發送。
發送語音圖片有三種方法。
1,
xmpp smack。檔案傳輸方式。
2,文字資料流。
3,伺服器中轉。
因為項目工期等原因,最終選擇了通過伺服器中轉的方式來實現這些功能,本部落格只是用於自己工作的記錄,有什麼不對的地方歡迎指正。
發送語言訊息需要和安卓共通,本來預期的方案是選擇使用amr格式的音頻。這樣工作量都壓在ios這邊。所以和安卓協商後選擇使用了mp3格式的音頻編碼。
首先是錄音功能的實現。怎麼錄音這裡就不說了。 錄音出來的音訊原始格式是caf,為了和安卓共通這裡需要將錄音進行轉碼。
出來吧,代碼君!!!~
//錄音檔案的地址 NSString *cafFilePath =self.voice.recordPath; NSString *mp3FilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/downloadFile.mp3"]; NSFileManager* fileManager=[NSFileManager defaultManager]; if([fileManager removeItemAtPath:mp3FilePath error:nil]) { NSLog(@"刪除"); } @try { int read, write; FILE *pcm = fopen([cafFilePath cStringUsingEncoding:1], "rb"); //source 被轉換的音頻檔案位置 fseek(pcm, 4*1024, SEEK_CUR); //skip file header FILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb"); //output 輸出產生的Mp3檔案位置 const int PCM_SIZE = 8192; const int MP3_SIZE = 8192; short int pcm_buffer[PCM_SIZE*2]; unsigned char mp3_buffer[MP3_SIZE]; lame_t lame = lame_init(); lame_set_in_samplerate(lame, 11025.0); lame_set_VBR(lame, vbr_default); lame_init_params(lame); do { read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm); if (read == 0) write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE); else write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE); fwrite(mp3_buffer, write, 1, mp3); } while (read != 0); lame_close(lame); fclose(mp3); fclose(pcm); } @catch (NSException *exception) { NSLog(@"%@",[exception description]); } @finally { //轉換完成後對音頻進行需要的操作 NSDate *dates = [NSDate date]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyyMMddHHmmss"]; NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/beijing"]; [formatter setTimeZone:timeZone]; NSString *loctime = [formatter stringFromDate:dates]; //拿到轉碼後的音頻 NSData *data = [NSData dataWithContentsOfFile:mp3FilePath]; NSString * fileName = [NSString stringWithFormat:@"%@.mp3",loctime]; //上傳伺服器操作,這裡是我介面類的上傳方法 [InterfaceClassFile upVoice:data toPicName:fileName]; //根據和伺服器的約定,拼好檔案在伺服器的地址。 //[rec]為 和安卓約定用於識別圖片和音訊標記 NSString * filePath = [NSString stringWithFormat:@"[rec]220.142.0.120:8080/lovebaby/tempfiles/%@/%@",strUserI d,fileName]; //調用xmpp發送資訊方法,將地址發送出去 XMPPMessage *message = [XMPPMessage messageWithType:@"chat" to:self.toJID]; [message addBody:filePath]; [[[self appDelegate] xmppStream] sendElement:message]; //列表資料重新整理 NSDictionary * dic = [[NSDictionary alloc]initWithObjectsAndKeys:[NSString stringWithFormat:@"%@", filePath], @"Message",loctime,@"MessageTime",@"0",@"isOutGoing",nil]; [tableData addObject:dic]; [self.tableView reloadData]; [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[tableData count]-1 inSection:0] atScrollPosition: UITableViewScrollPositionBottom animated:YES]; }
這樣,在接收端接收到的為一條文本資訊,裡面僅僅只是一個指向資源檔的url地址。
在拿到url後進行自己需要的操作。
圖片也是同理。
下面附上檔案上傳方法。
#pragma mark - chatVoiceUpload+(NSString * )upVoice:(NSData *)voiceOrPic toPicName:(NSString *)picName{ NSURL *url = [NSURL URLWithString:IP_UPLOADVOICE]; //建立表單請求 ASIFormDataRequest * request; request = [ASIFormDataRequest requestWithURL:url]; //設定參數 [request setPostValue:strUserId forKey:@"user_id"]; //圖片 NSString * fileName = picName; [request addData:voiceOrPic withFileName:fileName andContentType:@"image/jpeg"forKey:@"upload_file"]; NSLog(@"%@",request); //請求 [request setDelegate:self];[request setShowAccurateProgress:YES]; [request startSynchronous]; NSString * str = [[NSString alloc]initWithData:[request responseData] encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); NSError *error = [request error]; if (error) { // [[[UIAlertView alloc]initWithTitle:@"提示" message:@"上傳出錯,請稍後重試" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]show]; } return str; }
轉載請註明出處。