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. onload onmouseover 事件监听

    <div class="nav"> <ul> <li>翠翠</li> <li>嗯嗯</li> <li& ...

  2. C#调用Oracle存储过程的方法

    C#调用Oracle存储过程的方法 准备: 环境:pl/sql+oracle9i+vs2008 创建表test: create table TEST(  ID      NUMBER,//编号  NA ...

  3. Silverlight调用一般性处理程序模拟Silverlight调用WCF效果(2)

    [置顶] Silverlight调用一般性处理程序模拟Silverlight调用WCF效果(2) 分类: 技术2012-03-31 12:51 548人阅读 评论(0) 收藏 举报 silverlig ...

  4. [Swift]Array(数组)扩展

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. VUE学习之计算属性computed

    计算属性:computed 先看一下官网的说法 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="ex ...

  6. 20道spring boot面试题

    面试了少量人,简历上都说自己熟习 Spring Boot, 或者者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望. 下面,我给大家总 ...

  7. knockout jquery警告删除

    //触发删除的动作                $("a.delete").live('click', function () {                    var ...

  8. 【js】再谈移动端的模态框实现

    移动端模态框的机制因为与PC的模态框机制一直有所区别,一直是许多新人很容易踩坑的地方,最近笔者作为一条老咸鱼也踩进了一个新坑中,真是平日里代码读得太粗略,故而写上几笔,以儆效尤. 故事的起因是这样的, ...

  9. 状压DP UVA 10817 Headmaster's Headache

    题目传送门 /* 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][s2]表示s ...

  10. spring controller接口中,用pojo对象接收页面传递的参数,发现spring在对pojo对象赋值时,有一定顺序的问题

    1.我的项目中的实体类都继承了基类entityBase,里面封装了分页的一些属性,pageindex.pagesize.pagerownum等. 2.思路是页面可以灵活的传递分页参数,比如当前页pag ...