• Home
Name Date Size #Lines LOC

..--

AppScope/12-May-2024-3532

entry/12-May-2024-3,6393,232

hvigor/12-May-2024-2422

screenshots/12-May-2024-

script/12-May-2024-6637

.gitignoreD12-May-202495 77

README_zh.mdD12-May-20248.7 KiB141103

build-profile.json5D12-May-20241 KiB4241

hvigorfile.tsD12-May-2024159 21

hvigorwD12-May-20242.1 KiB6428

hvigorw.batD12-May-20242 KiB7256

oh-package.json5D12-May-2024833 2625

ohosTest.mdD12-May-20241.1 KiB1512

README_zh.md

1# 音频通话示例
2
3### 介绍
4
5本示例主要展示了音频通话相关的功能,使用[@ohos.multimedia.audio](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/reference/apis/js-apis-audio.md/)
6、[@ohos.net.socket](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/reference/apis/js-apis-socket.md/)
7等接口,实现音频录制和渲染,音频数据网络传输等功能
8
9### 效果预览
10
11| 发起通话                                       | 来电                                          | 通话页                                      | 悬浮窗                                          |
12|--------------------------------------------|---------------------------------------------|------------------------------------------|----------------------------------------------|
13| ![image](screenshots/devices/ring_up.jpeg) | ![image](screenshots/devices/incoming.jpeg) | ![image](screenshots/devices/voice.jpeg) | ![image](screenshots/devices/float_win.jpeg) |
14
15使用说明
16
171.语音通话需要运行服务端代码模拟启动流媒体服务端,连接成功后服务端会在终端打印client连接数,如下图:
18
19![img_1.png](screenshots/img1.png)
20
212.服务端和两台设备在局域网内组成socket网络,运行时需要注意修改ip地址:
22
23- 服务端地址在[socket.js](./script/socket.js)第19行修改
24- 客户端地址在[BufferModel.ets](./entry/src/main/ets/model/BufferModel.ets),将serverIp替换为服务端IP地址即可
25
26![img.png](screenshots/img2.png)
27
283.仅体验语音通话功能时,可以两台设备都手动启动语音通话应用,分别点击接听按钮进入通话页面
29
304.体验场景所有功能时,需要两台设备启动[聊天应用](../../Connectivity/StageSocket/),通过左下方语音按钮发起语音通话
31
325.一方发起语音通话请求,对方选择同意或拒绝
33
346.对方同意后,进行通话
35
367.通话页或请求通话页可以选择关闭麦克风或扬声器
37
388.对方拒接或同意后挂断,则返回聊天页面
39
40
41
42### 工程目录
43
44```
45/VoiceCallDemo
46├── entry             # 主entry模块目录
47│   └── src
48│       ├── main
49│           ├── ets                                # ets模块目录
50│               ├── audio                          # 音频录制和渲染
51│               ├── components                     # 组件目录
52│                   ├── ComponentOption.ets        # 按钮组件,如扬声器麦克风切换按钮
53│                   ├── ComponentPerson.ets        # 头像和名称组件
54│                   ├── ComponentVoiceBg.ets       # 通话公用父组件
55│                   ├── UIAnswer.ets               # 被呼叫UI
56│                   ├── UICall.ets                 # 呼叫UI
57│                   ├── UIVoice.ets                # 呼叫UI或通话UI
58│               ├── controller                     #
59│                   ├── FloatWindowController.ets  # 负责管理悬浮窗切换
60│                   ├── IndexController.ets        # 负责管理socket连接逻辑,worker启动停止,UI和通话事件传递
61│               ├── entryability
62│               ├── model                          #
63│                   ├── AudioManagerModel.ts       # mic开关和扬声器开关
64│                   ├── BufferModel.ts             # 流媒体连接,数据接收与发送,管理workers
65│                   ├── OptionModel.ets            # 与聊天示例应用通讯事件管理
66│               ├── net                            # 网络层封装代码,不含业务逻辑
67│               ├── pages                          #
68│               ├── utils                          # 工具类目录
69│               ├── workers                        # works目录
70│                   ├── CapturerWorker.ts          # 音频录制线程
71│                   ├── RendererWorker.ts          # 音频渲染线程
72│               ├── Constants.ts                   # 定义 workers 通讯常量,UI事件常量,IPC通讯常量
73
74```
75
76### 具体实现
77
78+ TCP socket模拟音频流网络传输:
79    + 代码:[BufferModel](entry/src/main/ets/model/BufferModel.ets)和 [SocketImpl](entry/src/main/ets/net/SocketImpl.ets)
80    + 使用@ohos.net.socket 的constructTCPSocketInstance创建TCP socket连接,模拟实现音频流网络传输
81    + 3s一次检查网络状态和尝试连接,实现网络异常时的处理逻辑
82+ 音频录制:
83    + [CapturerWorker](entry/src/main/ets/workers/CapturerWorker.ts)创建音频采集的子线程
84    + [AudioCapturerHelper](./entry/src/main/ets/audio/AudioCapturerHelper.ets)
85      使用@ohos.multimedia.audio.AudioCapturer完成音频采集 [具体使用参考](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/media/using-audiocapturer-for-recording.md/)
86+ 音频播放:
87    + [RendererWorker](entry/src/main/ets/workers/RendererWorker.ts)创建音频播放的子线程
88    + [AudioRendererHelper](./entry/src/main/ets/audio/AudioCapturerHelper.ets)
89      使用@ohos.multimedia.audio.AudioRenderer完成音频播放 [具体使用参考](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/media/using-audiorenderer-for-playback.md/)
90+ 麦克风与扬声器以及通话场景控制:
91    + 代码[AudioManagerModel](entry/src/main/ets/model/AudioManagerModel.ets)
92    + 使用@ohos.multimedia.audio.AudioManager的setAudioScene接口切换通话场景
93    + 使用@ohos.multimedia.audio.AudioVolumeGroupManager的setMicrophoneMute接口切换麦克风
94    + 使用@ohos.multimedia.audio.AudioRoutingManager的setCommunicationDevice接口切换扬声器
95
96### 相关权限
97
98| [权限](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/security/permission-list.md/) | 说明               | 权限登记         | 授权方式         |
99|-------------------------------------------------------------------------------------------------|------------------|--------------|--------------|
100| ohos.permission.MICROPHONE                                                                      | 允许应用使用麦克风        | normal       | user_grant   |
101| ohos.permission.INTERNET                                                                        | 允许使用Internet网络   | normal       | system_grant |
102| ohos.permission.GET_WIFI_INFO                                                                   | 允许应用获取WLAN信息     | normal       | system_grant |
103| ohos.permission.MANAGE_AUDIO_CONFIG                                                             | 允许应用进行全局麦克风静音等操作 | system_basic | system_grant |
104| ohos.permission.SYSTEM_FLOAT_WINDOW                                                             | 允许应用使用悬浮窗的能力     | system_basic | system_grant |
105
106### 依赖
107
1081. windows上启动node socket服务,模拟流媒体服务,音频数据使用pcm传输,未编解码. [代码](./script/socket.js)
1092. 需要使用[聊天示例](../../Connectivity/StageSocket/)启动音频通话功能
110
111![main](screenshots/img.png)
112
113### 约束与限制
114
1151.本示例仅支持标准系统上运行
116
1172.本示例仅支持API9版本SDK,版本号:3.2.11.10 Release
118
1193.本示例需要使用DevEco Studio 3.1 Beta2 (Build Version: 3.1.0.400, built on April 7, 2023)才可编译运行
120
1214.本示例涉及使用系统接口@ohos.multimedia.audio:setAudioScene,需要手动替换Full
122  SDK才能编译通过,具体操作可参考[替换指南](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/quick-start/full-sdk-switch-guide.md/)
123
1245.本示例所配置的权限为system_basic级别(
125  相关权限级别可通过[权限定义列表](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/security/permission-list.md/)
126  查看),需要手动配置对应级别的权限签名(
127  具体操作可查看[自动化签名方案](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/security/hapsigntool-overview.md/))
128
1296.本示例有使用系统特性api,需要手动配置对应级别的应用类型("app-feature": "hos_system_app")。具体可参考profile配置文件[bundle-info对象内部结构](https://gitee.com/openharmony/docs/blob/eb73c9e9dcdd421131f33bb8ed6ddc030881d06f/zh-cn/application-dev/security/app-provision-structure.md#bundle-info%E5%AF%B9%E8%B1%A1%E5%86%85%E9%83%A8%E7%BB%93%E6%9E%84)
130
131### 下载
132
133如需单独下载本工程,执行如下命令:
134
135```
136git init
137git config core.sparsecheckout true
138echo code\BasicFeature\Media\VoiceCallDemo\ > .git/info/sparse-checkout
139git remote add origin https://gitee.com/openharmony/applications_app_samples.git
140git pull origin master
141```