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; }

转载请注明出处。

ios xmpp 发送语音图片解决方案的更多相关文章

  1. iOS - XMPP 的使用

    1.XMPP XMPP 是一个基于 Socket 通信的即时通讯的协议,它规范了即时通信在网络上数据的传输格式,比如登录,获取好友列表等等的格式.XMPP 在网络传输的数据是 XML 格式. 开发架构 ...

  2. iOS XMPP 通信协议实现 图形化直观感受

    第一次随笔,实在不知写点什么有用的东西,那就分享一下本人最近的研究所得吧! 是关于iOS-XMPP-通信协议的实现,具体代码比较复杂,三言两句也实在难表达清楚,网上已有很多关于iOS XMPP协议的讲 ...

  3. iOS根据Url 获取图片尺寸

    iOS根据Url 获取图片尺寸 // 根据图片url获取图片尺寸 +(CGSize)getImageSizeWithURL:(id)imageURL { NSURL* URL = nil; if([i ...

  4. ios xmpp开发应用后台模式接收聊天信息处理方案

    ios xmpp开发应用后台模式接收聊天信息 最近在使用xmppframwork来实现一个聊天应用,碰到了一个问题,应用进入后台以后,就接收不到消息了: 怎么样才能使应用被切到后台时,应用中的网络连接 ...

  5. 如何在嵌入式Linux上开发一个语音通信解决方案

    开发一个语音通信解决方案是一个软件项目.既然是软件项目,就要有相应的计划:有多少功能,安排多少软件工程师去做,这些工程师在这一领域的经验如何,是否需要培训,要多长时间做完,中间有几个主要的milest ...

  6. iOS 解决LaunchScreen中图片加载黑屏问题

    iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...

  7. Android 图片压缩、照片选择、裁剪,上传、一整套图片解决方案

    1.Android一整套图片解决方案 http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820998&idx=1& ...

  8. IOS第六天(3:scrollView 图片轮播器)

    IOS第六天(3:scrollView 图片轮播器) #import "HMViewController.h" #define kImageCount 5 @interface H ...

  9. iOS网络加载图片缓存策略之ASIDownloadCache缓存优化

    iOS网络加载图片缓存策略之ASIDownloadCache缓存优化   在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...

随机推荐

  1. Android系统优化

    这些事实上就是优化rom 的一些实用小技巧. 认为非常多还是实用的. Build.prop (编辑 /system/build.prop 文件(须要root, 能够用文件管理器或者其它root exp ...

  2. 2016/2/18 html 标签 表格

    ①打开dreamw新建html 开头显示如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...

  3. 使用逆向工程生成mybatis的Mapper文件

    之前有写过一篇博客: 使用MyBatis Generator自动生成MyBatis的代码链接:http://www.cnblogs.com/klslb/p/6908535.html 这个太麻烦了,而且 ...

  4. 利用函数计算构建微信小程序的Server端

    10分钟上线 - 利用函数计算构建微信小程序的Server端-博客-云栖社区-阿里云 https://yq.aliyun.com/articles/435430 函数计算  读写 oss import ...

  5. http ssl

    http ssl

  6. 洛谷 P1037 产生数

    题目描述 给出一个整数n(n<10^30)和k个变换规则(k≤15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规则(k=2): 2->53-> ...

  7. G - And Then There Was One (约瑟夫环变形)

    Description Let’s play a stone removing game. Initially, n stones are arranged on a circle and numbe ...

  8. Java compiler level does not match the version of the installed Java project facet问题处理

    从SVN上下载应用后在Problems面板中提示以下错误信息: Java compiler level does not match the version of the installed Java ...

  9. 【转】MySQL常见的运算符及使用

    转自:http://www.linuxidc.com/Linux/2016-03/129672.htm MySQL中有4类运算符,它们是: 算术运算符 比较运算符 逻辑运算符 位操作运算符 算术操作符 ...

  10. 关于mybatis的xml文件中使用 >= 或者 <= 号报错的解决方案

    当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...