在进行视频通话、直播、在线教学时,用户经常需要将视频录制保存下来,方便后续观看。本文将介绍如何通过客户端 SDK 录制音视频并保存为本地文件。
功能介绍
通话过程中,可以录制本地或远端的音频流、视频流。相关实现主要涉及两个 API:
接口 | 功能描述 | 参数说明 |
| 启动本地录制功能,配置录制参数并开始录制。 |
|
| 停止正在进行的本地录制,并保存录制文件。 | 无。 |
示例代码
Android端本地录制:Android/ARTCExample/AdvancedUsage/src/main/java/com/aliyun/artc/api/advancedusage/LocalRecord/RecordingActivity.java
iOS端本地录制:iOS/ARTCExample/AdvancedUsage/LocalRecording/RecordingVC.swift
前提条件
在实现相关功能前,请确保满足以下条件:
功能实现
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)。在低性能设备上应适当降低录制质量以避免影响通话体验。