ios xmpp 發送語音圖片解決方案

來源:互聯網
上載者:User

標籤: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;    }
轉載請註明出處。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.