http://www.cnblogs.com/yulang314/p/3705611.html

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 headerFILE *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);elsewrite = 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/%@/%@",strUserId,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: UITableViewScrollPositionBottomanimated: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;}

转载请注明出处。

ios xmpp 发送语音图片解决方案相关推荐

  1. 微信小程序利用腾讯云IM发送语音 + 图片

    微信小程序利用腾讯云IM发送语音 + 图片 能做到这里 说明你已经可以发送普通文本了 如果没有的话可以看一下我的上一篇文章 有完整的讲解 效果图 语音聊天 发送图片 传送 → 发送图片 发送语音 ** ...

  2. Android即时通讯与IOS端发送语音的问题。

    现在在做一个即时通讯,要发送语音.大家规定好的是aac文件. 现在是我这边录的发给IOS那边可以播放,我自己录的传到服务器再下载下来自己也可以播放,但是IOS那边录的我down下来之后就不行了.放不了 ...

  3. android 发送语音功能和ios交互格式aac

    android 发送语音功能和ios交互格式aac 看到标题大家应该都知道了,本文主要实现android发送语音功能 前面几篇博客写的webSocket,notifaction和service,当然了 ...

  4. 小程序聊天群,发送语音,文字,图片。

    可以创建群,邀请群成员,群成员列表展示,图片发送,设置群公告,踢人,全体禁言,个人禁言,发送语音信息等功能. 效果图: 实现代码: 可以帮忙制作,手机号 .wx:17610241271 wxml &l ...

  5. iOS 仿微信发送语音消息按钮 - 手势按钮(一)

    最近在做基于XMPP的IM,开发到发送语音消息的功能.在某度上搜了很久也没有找到适合的方法.索性自己琢磨了一个,提供给大家参考.(其中找到的很多文章都是一个复制另一个的,很烦!没格式没头没尾的.给不了 ...

  6. 微信小程序云开发实现一对一即时聊天,发送语音、文件、图片、朋友圈、添加好友等功能

    点此源码获取 前几篇博文 前几篇文章实现了,利用云开发的即时通信demo做的仿照微信好友聊天. 本篇文章主要在前几篇的基础上进行的修改,实现 即时一对一聊天,群聊天,发送文件图片,发送语音,更换聊天背 ...

  7. iOS —— XMPP 详解

    iOS - XMPP 的使用 转载 https://www.cnblogs.com/QianChia/p/6411914.html 1.XMPP XMPP 是一个基于 Socket 通信的即时通讯的协 ...

  8. iOS 推送语音播报(类似支付宝微信的收款提醒)

    项目需求: 近期项目有个需求,实现类似支付宝微信收款后的语音播报如:支付宝到账xx元.要求是APP在前台运行.锁屏.杀死进程后都会有语音播报. 预想方案: 1.通过UIBackgroundTaskId ...

  9. 苹果发邀请函,月底或发新iPad;iPhone XR今日开启预购;阿里发布分布式语音交互解决方案 | 雷锋早报...

    阿里云IoT联合达摩院发布分布式语音交互解决方案 10月18日,阿里云IoT联合阿里巴巴达摩院正式发布分布式语音交互解决方案,该方案将集成双方的平台连接能力和语音交互技术,以声控的形式改造家居环境. ...

最新文章

  1. 【通知】深度学习之人脸图像算法核心代码开源和勘误汇总
  2. Django之URL路由系统
  3. why the ebitda and ebit differ so much for netflix?
  4. PCA原理分析和意义(一)
  5. Java中Comparable和Comparator接口区别分析
  6. 前端 Offer 提速:如何写出有亮点的简历
  7. 如何理解HTML结构的语义化?
  8. 【转】Topshelf 搭建 Windows 服务
  9. 74ls390设计任意进制计数器_《设计任意进制计数器》的实验报告
  10. PHP连接SQL SERVER 数据库 PHP连接MYSQL数据库并解决中文乱码问题。
  11. html行内设置样式,Js获取/设置行内样式和非行内样式
  12. 电子信息要学c语言嘛,电子信息工程专业主要学什么 一般工资是多少
  13. 加密解密-对称加密与非对称加密
  14. 读书笔记:《C++ PrimerPlus》 第九章~第十一章
  15. table 添加表行的底部边框、定制表格边框
  16. 链家网页爬虫_分享最近做的一个链家二手房爬虫和对爬到的数据进行可视化分析的案例...
  17. 【FPGA学习笔记】Verilog语言的模块化设计
  18. 甲骨文中国裁员补偿N+6,有人拿了一百多万...
  19. 关于“服务器限制无法上传那么大的附件 ”的解决方法
  20. P2657 [SCOI2009]windy数 题解

热门文章

  1. 使用VS Code通过Markdown语法快速画流程图时序图等
  2. 谷歌浏览器chrome 自己写的插件使用教程
  3. 基于微信小程序的宠物医院诊所小程序源码
  4. 噪声来源、定义及影响【转自微信公众号微波射频网】
  5. 【行研报告】2021年Q3小红书美妆行业营销报告—附下载链接
  6. 全面吃透JAVA Stream流操作,让代码更加的优雅
  7. 面试真题纠错(京东、爱奇艺)
  8. 2021年TWS耳机有哪些推荐?TWS耳机排名!
  9. 祖冲之究竟是如何算出圆周率的?
  10. 河南大学计算机学院魏倩,何欣-计算机与信息工程学院官网