客户端音频录制
更新时间: 2024/09/18 16:26:13
NERTC SDK 在实时音视频通话过程中,支持客户端录制和服务端录制两种录制方式。其中客户端录制支持对通话过程的实时音频录制,录制文件保存在用户本地设备中,适用于通话过程录音场景及对游戏场景中对音频问题的定位和排查。
功能介绍
客户端音频录制指在通话过程中将房间内混流后的音频流录制下来,并存放在用户本地设备中以供后续回放或存档。NERTC SDK 支持通过客户端进行实时音频录制,每次录制生成一个音频文件,其中包含房间内所有用户混流后的音频数据。开启录制时可以指定录制文件的存放路径、格式和内容、录制采样率及音质、循环缓存最大时长等。
目前支持的音频格式包括:
-
WAV:文件大,音质保真度高。
-
AAC:文件小,有一定的音质损失。
播放录制文件时,您可以选择使用系统默认的播放器,或者使用网易云信播放器 SDK,具体请参考点播。
注意事项
-
文件后缀必须以
.wav
或.aac
结尾。 -
加入房间后才能开始录音。
-
客户端只能同时运行一个录音任务。正在录音时,若您重复调用音频录制接口,会结束当前录音任务,并重新开始新的录音任务。
-
在您离开房间时,录音任务会自动停止。您也可以在通话中随时调用
StopAudioRecording
方法手动停止录音。 -
调用原先的
startAudioRecording
方法只能进行实时音频录制,调用全新的StartAudioRecordingWithConfig
方法可以进行实时音频录制或循环缓存录制,网易云信推荐您使用新版接口,方便您自由切换录制模式;调用其中任意一个音频录制接口且未停止的情况下,调用另外一个接口会自动结束本次音频录制,并开始新的音频录制。 -
在循环缓存录制模式下,若音频录制时长超过指定缓存时长,则最新音频数据会对原先的音频轨道进行覆盖;例如:设置缓存时长为 15 分钟,音频录制时长为 20 分钟,最终生成第 5 至 第 20 分钟的音频录制文件。
实现方法
API 调用时序
sequenceDiagram
autonumber
participant 应用层
participant NERtcSDK
应用层->>NERtcSDK: StartAudioRecordingWithConfig
NERtcSDK-->>应用层: OnAudioRecording
应用层 ->> NERtcSDK: StopAudioRecording
配置步骤
-
通过初始化接口中注册
IRtcEngine
子类,监听OnAudioRecording
事件,以接收录制过程中的录制信息。 -
在加入房间后,调用
StartAudioRecordingWithConfig
方法开启音频录制。调用此方法时,您需要设置filePath
、sampleRate
等参数指定录音文件的配置。相关参数的说明如下:-
filePath
:录音文件在本地保存的绝对路径,例如:sdcard/xxx/audio.aac
。目前仅支持 WAV 或 AAC 文件格式。请确保指定的路径存在并且可写。 -
sampleRate
:录音采样率。该参数单位为 Hz,可以取值为 16000、32000、44100 或 48000,默认值为 32000。 -
quality
:录音音质。可以指定 AAC 格式的录音文件为低音质、中音质或高音质,默认为中音质。 -
position
:录音对象。可以指定录制房间内所有成员混流后的音频数据(默认)、仅录制本地用户发布的音频流或仅录制所有远端用户混流后的音频数据。 -
cycleTime
:循环缓存的最大时长跨度。该参数单位为秒,可以取值为 0、10、60、360、900,默认值为 0,即实时写文件。
-
-
启用该方法后,SDK 会触发
OnAudioRecording
回调,返回音频录制状态及录音文件保存路径。 -
需要结束音频录制时,调用
StopAudioRecording
方法手动停止音频录制,同时 SDK 会触发相关回调。若您离开房间前未手动停止录音,离开房间后录音进程会自动结束;若您未手动停止本次音频录制又再次调用
StartAudioRecordingWithConfig
方法,本次录音文件会自动保存至本地指定路径,并开启新的录制任务。
示例代码
以实时音频录制为例,示例代码如下。
C# IRtcEngine rtcEngine = IRtcEngine.GetInstance();
//开启本地音频录制
private void startAudioRecording()
{
string filePath = System.IO.Path.Combine(Application.persistentDataPath, "audio.aac");
int sampleRate = 48000;
int result = rtcEngine.StartAudioRecording(filePath, sampleRate, RtcAudioRecordingQuality.kNERtcAudioRecordingQualityHigh);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
private void startAudioRecordingWithConfig()
{
string filePath = System.IO.Path.Combine(Application.persistentDataPath, "audio.aac");
int sampleRate = 48000;
var config = new RtcAudioRecordingConfiguration
{
filePath = filePath,
sampleRate = sampleRate,
quality = RtcAudioRecordingQuality.kNERtcAudioRecordingQualityHigh,
cycleTime = RtcAudioRecordingCycleTime.kNERtcAudioRecordingCycleTime10,
position = RtcAudioRecordingPosition.kNERtcAudioRecordingPositionMixedRecordingAndPlayback
};
int result = rtcEngine.StartAudioRecordingWithConfig(config);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
//停止本地音频录制
private void stopAudioRecording()
{
int result = rtcEngine.StopAudioRecording();
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
API 参考
方法 | 功能描述 |
---|---|
StartAudioRecordingWithConfig |
开启实时音频录制 |
OnAudioRecording |
音频录制回调 |
StopAudioRecording |
停止音频录制 |