---
title: 播放音频引擎服务端产生的音频数据
description: "通过调用音频引擎提供的API，用户可以播放音频引擎服务端发送的音频数据。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2300/armnative/kunpengcpsvideo_16_0033.html
sourcePath: /source/zh/kunpengboostkithistory/2300/armnative/kunpengcpsvideo_16_0033.html
indexId: 77b184f30204d69d3a1ab9f7bbd07d862a9668f909652361431b224251e8b1d277
---
# 播放音频引擎服务端产生的音频数据

#### 场景介绍

通过调用音频引擎提供的API，用户可以播放音频引擎服务端发送的音频数据。


#### 前提条件

NA


#### 开发流程

1. 用户通过通信模块，正确接收到音频引擎服务端发送的音频数据。
2. 用户调用音频引擎客户端提供的API，播放音频。
3. 用户注册客户端音频数据保存hook函数，音频引擎客户端会把接收到的音频数据通过hook函数进行保存。
4. 用户可以调用音频引擎客户端提供的API，开启/关闭音频播放。


#### 编码实例

具体场景

依据开发流程，通过调用音频引擎客户端的API，播放服务端发送的音频数据，并将音频数据进行保存。

代码样例

```
import android.util.Log;
import com.huawei.cloudgame.audioplay.AUDIOSAVEHOOK;
import com.huawei.cloudgame.audioplay.AudioTrackPlayer;
public class DataPipe implements AUDIOSAVEHOOK {
private static DataPipe instance = new DataPipe();
private DataPipe() {
}
public static DataPipe getInstance() {
return instance;
}
public void audioSaveData(byte[] data, int length) {
// 音频保存接口的具体实现，由用户自己实现
}
public static void registerAudioSaveHook() {
int ret = AudioTrackPlayer.getInstance().registerAudioSaveHook(DataPipe.getInstance());
if (ret != AudioTrackPlayer.VMI_SUCCESS) {
Log.e("AudioClient", "register audio save hook fail. ret=%d", ret);
}
}
}
public class Test {
public static void main(String[] args) {
DataPipe.registerAudioSaveHook();
byte[] data = getRecvData() // 示意函数：获取音频引擎服务端发送的音频数据函数。
int ret = AudioTrackPlayer.getInstance().onRecvAudioPacket(data, data.length);
if (ret != AudioTrackPlayer.VMI_SUCCESS) {
Log.e("AudioClient", "audio client play audio fail");
}
ret = AudioTrackPlayer.startAudio();
if (ret != AudioTrackPlayer.VMI_SUCCESS) {
Log.e("AudioClient", "audio client start fail");
}
ret = AudioTrackPlayer.stopAudio();
if (ret != AudioTrackPlayer.VMI_SUCCESS) {
Log.e("AudioClient", "audio client stop fail");
}
}
}
```
