IM 语音消息
发送语音文件,需要先上传语音文件,然后再发送此消息。
音频格式
主要的录制格式有 mp3、AAC、iLBC、Speex、amr 这几种,每个格式都各有特点 iLBC、Speex、amr 录制的文件占用空间小,更适合网络传输的。
现将各录音格式的解决方式总结如下:
- aac:两系统应该都支持的格式,但有说 Android 设备有支持的不够好。
- mp3:iOS、Android 录制都需要进行编码转换,使用 lame 第三方库,播放应该都可以直接播放。
- iLBC:iOS 支持编码解码, Android 低版本不支持,不过有开源第三方库,可以进行录制编码,播放解码的处理。
- Speex:也是开源的第三方库,声称文件小,能降噪,需要 iOS、Android 客户端都进行编码解码处理。
- amr:iOS 4.3 之前的版本支持,以后版本都不支持 amr 格式,Android 设备支持该格式,采用这种格式,iOS 设备可用 libOpenCore 第三方库进行转换,播放时再进行解码成原始 pcm 进行播放。Android设备可直接录制与播放。
方案选择上,应该 aac 最方便,其他的都各有千秋,考虑到浏览器前端的支持音频类型,使用 mp3 兼容性最强。
转码解决方式总结如下:
- 第一种方案,对于服务器负荷较大,不论是 Android 端亦或是 iOS 端都将音频传输到服务器,通过服务器进行转换再进行转发。这种做法可以不受系统限制,但是信息量较大时对服务器负荷较大,对服务器端的要求很高。据传闻,微信就是采用这种方式进行的语音 IM 交互。
- 第二种方案,是不论 iOS 端还是 Android 端都统一使用相同的第三方音频库进行编解码处理,然后再进行网络传输,优点是可供选择的音频库非常多,可以根据自己不同的需求选择各种各样的音频格式,但是因为不论是 iOS 端还是 Android 端都需要对其进行编码解码处理,而项目初期并没有设计这方面的需求所以如果双端都进行修改修改量实在太大。同样据传闻,同为语音 IM 的成熟案例微米就是依靠 Speex 的三方开源库来完成的,这种格式体积小,能降噪,是目前比较受推崇的方式。
- 第三种方案,amr 格式的音频文件是 Android 系统中默认的录音文件,也算是 Android 支持的很方便的音频文件,iOS 系统曾经是支持这种格式的文件,自 iOS 4.3 以后才取消了对 amr 的支持,需要在 iOS 端成功的转换出 Android 端可以使用的 amr 文件。
方案选择上,考虑到需要同时支持移动端和前端,可以优先选择服务器转码或者先转码再上传的方式,第三方音频库方式依赖性、复杂性很高。
尽管MP3格式可能是现有的最流行的音频格式,但在编码语音方面并不是特别有效(与AMR相比)。另一方面,AMR格式在这样的任务上非常出色,即使它不受硬件和软件的广泛支持,也是首选格式。 您可能会在数字音乐中遇到的最常见的AMR应用程序是使用便携式设备(例如MP3播放器或智能手机)来捕获声音。如今,使用内置电容麦克风,许多MP3播放器可以兼作录音机。为了有效利用MP3播放器的有限存储空间(尤其是基于闪存的存储空间),设备制造商可能会选择使用AMR格式。平均而言,AMR格式的文件比用于存储音乐的更流行的格式(例如MP3,AAC,WAV和WMA)小得多。
音频的组成
当前,我们所说的音频,都是数字音频。数字音频由采样频率、采样精度、声音通道数三个部分组成。
- 采样频率:既采样率,指记录声音时每秒的采样个数,它用赫兹(Hz)来表示。一般用44.1kHz,也可以是>8kHz,11.025kHz,48kHz,96kHz等。
- 采样精度:指记录声音的动态范围,它以位(Bit)为单位,单个音频采样用得较多的是16位,当然也可以使用8位,24位,甚至32位
- 声音通道:既声道数(1-8个),用的较多的是2声道,也有单声道,5.1声道,7.1声道。
通俗点说,我们可以把声波看成是一条曲线,我们知道,曲线是由点组成的,采样率就是每秒长度(上图横轴)中点的个数。而采样精度就是动态范围(上图竖轴)中点的个数。这两个维度的定位越细,声音的真实还原度就越高,音质也就会更好,当然,音频文件也就会越大。
一帧:应该是指持续采样时间,这个是很灵活的可以使用20ms,也可是200ms,一般来说时间越短延时就越少。 这样一帧的 PCM 数据大小就很容易计算出来:
PCMBufferSize = 采样率采样时间采样位深 / 8 * 通道数 Bytes
采样率根据使用类型不同大概有以下几种(k既千位符号,1khz=1000hz):
- 8khz:电话等使用,对于记录人声已经足够使用。
- 22.05khz:广播使用频率。
- 44.1kb:音频CD。
- 48khz:DVD、数字电视中使用。
- 96khz-192khz:DVD-Audio、蓝光高清等使用。
采样精度常用范围为8bit-32bit,而CD中一般都使用16bit。
计划参数
- recordType:录制音频类型(aac/amr)
- maxDuration:最长录音时长,到该长度后,会自动停止录音
- filename: 指定一个文件名(messages.amr)
- length: 录音长度(10)
- audioUrl: 成功上传文件返回的UUID(a1.easemob.com/1dfc7f50-7d…
- audio_secret: 成功上传文件后返回的校验码(Hfx_WlXGEeSdDW-SuX2EaZcXDC7ZEig3OgKZye9IzKOwoCjM)
语音录制动作交互分解
- 按下按钮,开始录制,显示录音指示界面;
- 手指上滑,暂停录制,显示“松开手指取消发送”,如果这个时候松开手指,取消录制,并不会发送;
- 手指滑回录制按钮位置,继续录音;
- 松开手指,录音完成,发送;
- 录制时长小于1秒,显示时间太短,不发送;
- 录制时长超过60秒,自动结束录制,并自动发送。
MP3 编码器 - LAME
LAME 是最好的 MP3 编码器,编码高品质 MP3 的最好也是唯一的选择。LAME 本身是控制台程序,需要加外壳程序才比较容易使用,也可以在别的软件(比如 EAC)中间调用。是一款出色的 MP3 压缩程序,它使用了独创的人体听音心理学模型和声学模型,改变了人们对 MP3 高音发哑、低音发破的音质的印象。
IM 软件中的语音录制与播放: juejin.cn/post/684490…
IM 视频消息
发送视频消息,需要先上传视频文件和视频缩略图文件,然后再发送此消息。
视频格式
移动端、大前端:录制视频类型(mp4)
计划参数
- recordType:录制视频类型(mp4)
- length: 视频播放长度(10)
- maxDuration:最长视频时长,到该长度后,会自动停止录音
- file_length: 视频文件大小(58103)
- filename: 指定一个文件名(messages.amr)
- videoUrl: 成功上传视频文件返回的UUID(a1.easemob.com/1dfc7f50-7d…
- video_secret: 成功上传文件后返回的校验码(Hfx_WlXGEeSdDW-SuX2EaZcXDC7ZEig3OgKZye9IzKOwoCjM)
- thumb: 成功上传视频缩略图返回的UUID(a1.easemob.com/67279b20-21…
- thumb_secret: 成功上传视频缩略图后返回的secret(ZyebKn9pEeSSfY03ROk7ND24zUf74s7HpPN1oMV-1JxN2O2I)
IM 音视频通话
App 与 SDK 的逻辑关系
以融云 SDK 为例,集成 SDK 之前,请先了解 App 与 SDK 的逻辑关系,如下:
连接成功之后 (Android 为 connect 方法,iOS 为 connectWithToken 方法),融云提供两种加入聊天室的方式:
1.App Server 创建聊天室,客户端调用 joinExistChatRoom
加入聊天室,如果聊天室不存在,则加入不成功,需要 App Server 先调用 RongCloud Server 创建聊天室,如图:
如果聊天室已经存在,则可直接加入聊天室,如图:
2.App Server 只管理聊天室 Id 列表,客户端调用 joinChatRoom
加入聊天室,如果聊天室不存在则自动创建。
App 客户端需要实现的功能
- 初始化 SDK。
- 加入、退出聊天室。
- 初始化视频播放器(多家合作厂家可选)。
- 调用 SDK 接口实现收发消息功能。
- 实现文字、表情、点赞、鲜花等功能、UI 显示处理。
App 客户端还可以实现的功能
- 自定义任意消息及其显示样式(也可以不显示)。
- 客户端本地插入消息,而不发送出去。
- 监听消息收发,App 可以按自己需求控制逻辑和 UI。
- 后期可以很方便地集成 IMKit,快速扩展出单聊、群聊、黑名单、客服、实时音视频等功能。
App 服务器需要实现的功能
- 管理用户体系和 SDK 的 userId 的映射关系。
- 实现从 SDK Server 获取 Token 的逻辑。
- 根据 App 的产品逻辑,维护每个聊天室的信息和聊天室列表
App 服务器还可以实现的功能
通过调用SDK Server API 实现以下功能:
- 创建、销毁聊天室。
- 查询聊天室的信息。
- 查询聊天室中的用户列表。
- 设置聊天室用户用户禁言、封禁。
- 设置消息敏感词。
- 按消息类型设置消息优先级。
参考
IM 软件中的语音录制与播放【iOS】juejin.cn/post/684490…