iOS SDK 2.0 语音及图片消息详解
本文档将详细介绍融云的语音及图片消息接口功能及使用说明。阅读本文前,我们假设您已经阅读了融云 iOS 开发指南,并掌握融云 SDK 的基本用法。

语音消息
用来发送语音片段消息,您可以通过融云客户端 IMLib 接口或 Server API 接口发送语音消息。如果您使用的是融云 IMKit 则该功能已经在 SDK 中封装好,直接使用即可。以下为通过融云 IMLib 及 Server API 发送语音消息的方法。

从客户端发送消息
获取要发送的语音数据 wavData,并获得语音时长,通过 sendMessage 方法,传入相应的参数即可发送语音消息,方法说明参见 API 文档链接。

消息类名:RCVoiceMessage

代码示例:

- (void)sendVoiceMessage:(NSData *)wavData duration:(long)duration targetId:(NSString *)targetId conversationType:(RCConversationType)conversationType {
 //语音消息实体
 RCVoiceMessage *voiceMessage = [RCVoiceMessage messageWithAudio:wavData duration:duration];

[[RCIMClient sharedRCIMClient] sendMessage:conversationType targetId:targetId content:voiceMessage pushContent:nil pushData:nil success:^(long messageId) {
    //NSLog(@"发送语音消息成功");
 } error:^(RCErrorCode nErrorCode, long messageId) {
    //NSLog(@"发送语音消息失败,错误码是(%ld)", (long)nErrorCode);
 }];
}
建议录音参数如下:

rcVoiceRecorderHandler.recordSettings = @{
 AVFormatIDKey : @(kAudioFormatLinearPCM),
 AVSampleRateKey : @8000.00f,
 AVNumberOfChannelsKey : @1,
 AVLinearPCMBitDepthKey : @16,
 AVLinearPCMIsNonInterleaved : @NO,
 AVLinearPCMIsFloatKey : @NO,
 AVLinearPCMIsBigEndianKey : @NO
 };
注意:建议语音消息时长最小为 1 秒,最长不能超过 60 秒。语音格式为 WAV,在消息通讯过程中语音消息都是通过转码成 AMR 格式,在 Base64 编码后进行传输。
从服务端发送消息
如果您需要从服务端发送语音消息,融云也提供了 Server API 接口,下面以发送单聊消息为例,说明如何发送语音消息。

调用 Server API 接口发送语音消息前,您需要需要将语音内容进行 Base64 编码 Encode 后,需要将所有 \r\n 替换成空,否则无法进行正确解析。

消息 ObjectName:RC:VcMsg

消息的结构:{"content":"bhZPzJXimRwrtvc=","duration":7,"extra":""}

其中 content 为语音消息录制转码成 AMR 格式后,进行 Base64 编码 Encode 后的结果值,duration 为语音消息的时长(单位:秒),extra 可以放置任意的数据内容,也可以去掉此属性。

注意:在对内容进行 Base64 编码 Encode 后,需要将所有 \r\n 替换成空,否则无法进行正确解析。建议语音消息时长最小为 1 秒,最长不能超过 60 秒。语音格式为 AMR。
代码示例:

Request:

POST /message/private/publish.json HTTP/1.1
Host: api.cn.ronghub.com
App-Key: uwd1c0sxdlx2
Timestamp: 1408706337
Nonce: 14314
Signature: 890b422b75c1c5cb706e4f7921df1d94e69c17f4
Content-Type: Application/x-www-form-urlencoded

content={"content":"IyFBTVIKPJEXFr5meeHgAeev8","duration":3,"extra":"helloExtra"}&fromUserId=2191&toUserId=2191&toUserId=2192&objectName=RC:TxtMsg&pushContent=thisisapush&pushData={\"pushData\":\"hello\"}&count=1
Response:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{"code":200}
发送单聊消息方法参数说明,请参见文档。

接收语音消息解析
融云 SDK 接收到语音消息时,会按以下方式进行解析:

- (void)decodeWithData:(NSData *)data {
#if 1
  __autoreleasing NSError *__error = nil;
  if (!data) {
    return;
  }
  NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data
                                                       options:kNilOptions
                                                         error:&__error];
    RCDictionary *json = [[RCDictionary alloc] initWithDictionary:dictionary];
#else
  NSString *jsonStream =
      [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  NSDictionary *json = [RCJSONConverter dictionaryWithJSONString:jsonStream];
#endif
  if (json) {
    NSString *base64Audio = [json stringObjectForKey:@"content"];

self.extra = [json stringObjectForKey:@"extra"];

if (base64Audio) {
      NSData *audioData = nil;
      if (class_getInstanceMethod(
              [NSData class],
              @selector(initWithBase64EncodedString:options:))) {
        audioData = [[NSData alloc] initWithBase64EncodedString:base64Audio
                                                        options:kNilOptions];
      } else {
        audioData = [RCUtilities dataWithBase64EncodedString:base64Audio];
      }

NSData *decodedData = [[RCAMRDataConverter sharedAMRDataConverter]
          dcodeAMRToWAVE:audioData];
      self.wavAudioData = decodedData;
    }

self.duration = [[json numberObjectForKey:@"duration"] longValue];

}
}
图片消息
用来发送图片类消息,您可以通过融云客户端 IMLib 接口或 Server API 接口发送图片消息。如果您使用的是融云 IMKit 则该功能已经在 SDK 中封装好,直接使用即可。以下为通过融云 IMLib 及 Server API 发送图片消息的方法。

图片发送机制
图片消息包括两个主要部分:缩略图和大图,缩略图直接 Base64 编码后放入 content 中,大图首先上传到文件服务器(融云 SDK 中默认上传到七牛云存储),然后将云存储上的大图地址放入消息体中。流程示意如下:

如果,您在发送图片消息时,希望将图片上传到自已的服务器然后发送图片消息。流程示意如下:

图片缩略图机制
缩略图尺寸为:240 x 240 像素,以宽度和高度中较长的边不超过 240 像素等比压缩。

大图尺寸为:960 x 960 像素,以宽度和高度中较长的边不超过 960 像素等比压缩。

从客户端发送消息
调用 sendMessage 方法,传入相应的参数即可发送图片消息。方法说明,请参见 API 文档链接。

消息类名:RCImageMessage

代码示例:

- (void)sendImageMessage:(UIImage *)originImage targetId:(NSString *)targetId conversationType:(RCConversationType)conversationType {
 //图片消息实体
 RCImageMessage *imageMessage = [RCImageMessage messageWithImage:originImage];

//设置full为YES,会发送原图。不设置默认发送经过压缩的图片。
 //imageMessage.full = YES;

[[RCIMClient sharedRCIMClient] sendImageMessage:conversationType targetId:targetId content:imageMessage pushContent:nil progress:^(int progress, long messageId) {
      //这里更新文件上传进度
 } success:^(long messageId) {
      //上传成功
 } error:^(RCErrorCode errorCode, long messageId) {
      //上传失败
 }];
}
如果,您在发送图片消息时,希望将图片上传到自已的服务器然后发送图片消息,代码示例如下:

- (void)sendImageMessage2AppServer:(UIImage *)originImage targetId:(NSString *)target conversationType:(RCConversationType)conversationType {
   //图片消息实体
   RCImageMessage *imageMessage = [RCImageMessage messageWithImage:originImage];

[[RCIMClient sharedRCIMClient] sendImageMessage:conversationType targetId:target content:imageMessage pushContent:nil pushData:nil uploadPrepare:^(RCUploadImageStatusListener *uploadListener) {
   //在这里上传。上传要告诉融云状态和结果
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
     int i = 0;
     for (i = 0; i < 100; i++) {
       //上传图片到自己服务器,并通知融云进度,进度范围时0-100
       uploadListener.updateBlock(i);
       [NSThread sleepForTimeInterval:0.2];
     }
     //通知融云上传结果,参数是上传成功的url
     uploadListener.successBlock(@"http://www.rongcloud.cn/images/newVersion/bannerInner.png?0717");
   });
   } progress:^(int progress, long messageId) {
        //在这里更新UI进度。
   } success:^(long messageId) {
        //消息发送成功
   } error:^(RCErrorCode errorCode, long messageId) {
        //消息发送失败
   }];
}
sendImageMessage 方法说明,请参见 API 文档链接。

从服务端发送消息
如果您需要从服务端发送图片消息,融云也提供了 Server API 接口,下面以发送单聊消息为例,说明如何发送图片消息。

消息 ObjectName:RC:ImgMsg

消息的结构:{"content":"bhZPzJXimRwrtvc=","imageUri":"http://p1.cdn.com/fds78ruhi.jpg","extra":""}

其中 content 为图片内容进行 Base64 编码的结果值,imageUri 为图片上传到图片存储服务器后的地址,extra 可以放置任意的数据内容,也可以去掉此属性。

代码示例:

Request:

POST /message/private/publish.json HTTP/1.1
Host: api.cn.ronghub.com
App-Key: uwd1c0sxdlx2
Timestamp: 1408706337
Nonce: 14314
Signature: 890b422b75c1c5cb706e4f7921df1d94e69c17f4
Content-Type: Application/x-www-form-urlencoded

content={"content":"bhZPzJXimRwrtvc=","icon":"http://www.demo.com/p1.png","imageUri":"http://www.demo.com/1.jpg","extra":"helloExtra"}&fromUserId=2191&toUserId=2191&toUserId=2192&objectName=RC:TxtMsg&pushContent=thisisapush&pushData={\"pushData\":\"hello\"}&count=1
Response:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{"code":200}
发送单聊消息方法参数说明,请参见文档。

iOS - 语音云通讯的更多相关文章

  1. 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布

    经过恩布团队全体成员的不懈努力,依照原定计划,最终在今天(5月14日)公布第二个开源版本号,恩布企业互联IM,ENTBOOST 0.2.0(r174beta)Windows版本号:主要功能支持文本.表 ...

  2. Atitit s2018.2 s2 doc list on home ntpc.docx  \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 讯飞科大 语音云.docx \Atitit 代码托管与虚拟主机.docx \Atitit 企业文化 每日心灵 鸡汤 值班 发布.docx \Atitit 几大研发体系对比 Stage-Gat

    Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系  法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别   ...

  3. PaaSoo云通讯-印度市场机遇与挑战并存

    2019年4月16日,由白鲸出海举办的2019中印互联网大会(Global Connects India)在印度新德里举行,这次的大会主要涵盖了出海主题峰会.B2B展会.中印互联网高层圆桌等模块. 众 ...

  4. python-在python3中使用容联云通讯发送短信验证码

    容联云通讯是第三方平台,能够提供短信验证码和语音通信等功能,这里只测试使用短信验证码的功能,因此只需完成注册登录(无需实名认证等)即可使用其短信验证码免费测试服务,不过免费测试服务只能给控制台中指定的 ...

  5. Android讯飞语音云语音听写学习

    讯飞语音云语音听写学习         这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...

  6. 容联云通讯_提供网络通话、视频通话、视频会议、云呼叫中心、IM等融合通讯能力开放平台。

    容联云通讯_提供网络通话.视频通话.视频会议.云呼叫中心.IM等融合通讯能力开放平台. undefined

  7. 基于科大讯飞语音云windows平台开发

    前记: 前段时间公司没事干,突发奇想想做一个语音识别系统,看起来应该非常easy的,但做起来却是各种问题,这个对电气毕业的我,却是挺为难的.谷姐已经离我们而去,感谢度娘,感谢CSDN各位大神,好歹也做 ...

  8. Luffy之注册认证(容联云通讯短信验证)

    用户的注册认证 前端显示注册页面并调整首页头部和登陆页面的注册按钮的链接. 注册页面Register,主要是通过登录页面进行改成而成. 先构造前端页面 <template> <div ...

  9. 【转+修改】容联云通讯api调用短信发送调用

    转自   https://my.oschina.net/u/1995134/blog/814540 需要荣联云通讯 的 相对应SDKjar包. CCP_REST_SMS_SDK_JAVA_v2.6.3 ...

随机推荐

  1. Erlang 进程被抢占的条件——一个进程长时霸占调度器的极端示例

    最近研究 binary 的实现和各种操作对应的 beam 虚拟机汇编指令,发现有一些指令序列是不可重入的,比如说有的指令构造一个上下文(也就是某种全局状态),然后下一条指令会对这个上下文做操作(具体的 ...

  2. 【PHP】$_POST, $HTTP_RAW_POST_DATA, and php://input

    1.HTML <form> enctype Attribute application/x-www-form-urlencoded  传送之前所有的字符都会被encoded,(spaces ...

  3. 烂泥:LVM学习之逻辑卷、卷组及物理卷删除

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上篇文章,我们介绍了有关LVM的逻辑卷及卷组的空间缩小.这次我们来介绍下如何删除一个逻辑卷及卷组. 删除逻辑卷需要以下几个步骤: 1. 卸载已经挂载的逻 ...

  4. 如何去设计一个自适应的网页设计或HTMl5

    如何去设计一个自适应的网页设计或HTMl5 如今移动互联网随着3G的普及,越来越火爆,更多需求跟随而来!APP应用市场和APP应用数量成倍成倍的增长!从而给移动互联网带来新的挑战! 移动设备正超过桌面 ...

  5. Storm集群的安装与测试

    首先安装zookeeper集群,然后安装storm集群. 我使用的是centos 32bit的三台虚拟机. MachineName ip namenode 192.168.99.110 datanod ...

  6. 测试思考[持续更新ing]

    1.如何设计好的测试用例,提高测试覆盖率?提高测试效率? 2.如何展现测试成果? 3.如何编写专业化.优质的测试文档? 4.如何适时借助测试工具,测试一些重复性比较高的测试? 5.如何引入自动化测试? ...

  7. css3中box-flex的使用

    语法: box-flex:<number> 其中number取值:使用浮点数指定对象所分配其父元素剩余空间的比例.设置或检索伸缩盒对象的子元素如何分配其剩余空间. html代码: < ...

  8. 网页中插入FLASH(swf文件),并且让Flash不遮挡HTML元素

    一:网页中插入flash代码如下:  当然里面的很多属性可以去掉,根据具体的需求而定.  我们在网页中经常遇到播放flash,要正常播放flash就要用到OBJECT和EMBED这两个标签.鉴于火狐及 ...

  9. POJ 2142 The Balance【扩展欧几里德】

    题意:有两种类型的砝码,每种的砝码质量a和b给你,现在要求称出质量为c的物品,要求a的数量x和b的数量y最小,以及x+y的值最小. 用扩展欧几里德求ax+by=c,求出ax+by=1的一组通解,求出当 ...

  10. GitHub上史上最全的Android开源项目分类汇总

    今天在看博客的时候,无意中发现了 @Trinea 在GitHub上的一个项目 Android开源项目分类汇总 ,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫 ...