客户端本地录制

在进行视频通话、直播、在线教学时,用户经常需要将视频录制保存下来,方便后续观看。本文将介绍如何通过客户端 SDK 录制音视频并保存为本地文件。

功能介绍

通话过程中,可以录制本地或远端的音频流、视频流。相关实现主要涉及两个 API:

接口

功能描述

参数说明

startRecord

启动本地录制功能,配置录制参数并开始录制。

  • recordType:录制类型,可选择纯音频或者音视频录制。

  • recordFormat:录制文件的格式。纯音频支持 AAC 和 WAV 格式;视频支持 MP4 格式。

  • filePath:录制文件保存路径。

  • audioConfig:录制音频的配置,包括采样率、录制质量、是否允许录制外部采集或外部播放的音频。

  • videoConfig:录制视频配置,包括视频的质量、编码模式。

  • maxSize:最大允许录制的文件大小,单位为字节。当录制的文件超过此大小后自动停止录制。

  • maxDuration:最大允许录制的文件时长,单位为秒。当录制的文件时长超过这个时间后自动停止录制。

stopRecord

停止正在进行的本地录制,并保存录制文件。

无。

示例代码

Android端本地录制Android/ARTCExample/AdvancedUsage/src/main/java/com/aliyun/artc/api/advancedusage/LocalRecord/RecordingActivity.java

iOS端本地录制iOS/ARTCExample/AdvancedUsage/LocalRecording/RecordingVC.swift

前提条件

在实现相关功能前,请确保满足以下条件:

功能实现

image

1. 初始化录制配置

在调用startRecord接口开始录制之前,需要先配置录制参数。

Android

AliRtcEngine.AliRtcRecordType recordType = AliRtcEngine.AliRtcRecordType.AliRtcRecordTypeVideo;  // 录制类型,仅录制音频/录制视频
AliRtcEngine.AliRtcRecordFormat recordFormat = AliRtcEngine.AliRtcRecordFormat.AliRtcRecordFormatMP4; // 录制格式,音频:AAC、WAV; 视频: MP4
String filePath = getApplicationContext().getExternalFilesDir( null) + "/record"; // 保存路径
Log.i("startRecord", "filePath:" + filePath);
// 音频录制配置
AliRtcEngine.AliRtcRecordAudioConfig audioConfig = new AliRtcEngine.AliRtcRecordAudioConfig();
audioConfig.sampleRate = AliRtcEngine.AliRtcAudioSampleRate.AliRtcAudioSampleRate_48000; // 采样率
audioConfig.quality = AliRtcEngine.AliRtcAudioQuality.AliRtcAudioQualityHigh;  // 音质越高文件越大
audioConfig.externalPcmCaptureRecording = true;  // 是否允许录制外采音频
audioConfig.externalPcmRenderRecording = true;   // 是否允许录制外部输入的播放音频

// 视频录制配置
AliRtcEngine.AliRtcRecordVideoConfig videoConfig = new AliRtcEngine.AliRtcRecordVideoConfig();
videoConfig.quality = AliRtcEngine.AliRtcVideoQuality.AliRtcVideoQualityDefault;
videoConfig.encodeMode = AliRtcEngine.AliRtcRecordVideoEncodeMode.AliRtcRecordReusingEncoderMode;  // 复用推流编码器的流/重新编码

long maxSize = -1; // 最大文件大小,单位为字节,超过自动停止录制。
long maxDuration = -1; // 最大录制时长,单位为秒,超过自动停止录制。

iOS

// 录制类型:可选音频/音视频,在此演示音视频
let recordType:AliRtcRecordType = .video // 包含音频+视频,支持MP4
// 录制格式
let recordFormat: AliRtcRecordFormat = .MP4
// 录制文件保存路径(应用沙盒目录)
let fileDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let filePath = (fileDirectory as NSString).appendingPathComponent("record")
let fm = FileManager.default
if !fm.fileExists(atPath: filePath) {
    try? fm.createDirectory(atPath: filePath, withIntermediateDirectories: true, attributes: nil)
}

// 音频录制配置,根据业务自行配置
var audioConfig = AliRtcRecordAudioConfig(
    sampleRate: ._48000,                    // 采样率48k
    quality: .high,                         // 高音质
    enableRecordExternalRenderPCM: true,    // 允许录制使用自定义采集输入的音频
    enableRecordExternalCapturePCM: true    // 允许录制使用自定义播放的声音
)
// 视频录制配置
var videoConfig = AliRtcRecordVideoConfig(
    quality: .default,
    sourceType: .video,
    canvas: AliRtcRecordVideoCanvasConfig(canvasWidth: 720, canvasHeight: 1280),
    fps: 30,
    bitrate: 1200
)
// 录制文件大小和时长限制
let maxSize: Int64 = -1     // 单位: 字节
let maxDuration: Int32 = -1 // 单位: 秒

2. 开始录制

使用配置好的 recordConfig 对象启动录制功能。接口调用成功后,SDK 将根据配置开始录制当前通话的音视频流。

Android

mAliRtcEngine.startRecord(recordType, recordFormat, filePath, audioConfig, videoConfig, maxSize, maxDuration);

iOS

let result = withUnsafeMutablePointer(to: &audioConfig, { audioPtr in
    withUnsafeMutablePointer(to: &videoConfig, { videoPtr in
        engine.start(
            recordType,
            recordFormat: recordFormat,
            filePath: filePath,
            audioConfig: audioPtr,
            videoConfig: videoPtr
        )
    })
})

3. 停止录制

开始录制后,您可以调用stopRecord接口主动停止录制。

Android

mAliRtcEngine.stopRecord();

iOS

rtcEngine?.stopRecord()

4. 获取录制文件

录制完成后,可在指定路径下找到生成的录制文件。开发者可根据业务需求进一步处理该文件,例如上传到服务器、播放回放或删除临时文件。

说明
  • 确保应用具备访问存储空间的权限(如 Android 上的 WRITE_EXTERNAL_STORAGE)。

  • 在低性能设备上应适当降低录制质量以避免影响通话体验。