在進行視訊通話、直播、線上教學時,使用者經常需要將視頻錄製儲存下來,方便後續觀看。本文將介紹如何通過用戶端 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介面開始錄製之前,需要先推流,publish成功後(狀態變化後),配置錄製參數。
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 // 單位: 秒Mac
/*
設定音頻設定
*/
AliRtcRecordAudioConfig AudioConfig ;
AudioConfig.quality = AliRtcAudioQualityMidium ;
AudioConfig.sampleRate = AliRtcAudioSampleRate_48000 ;
AudioConfig.enableRecordExternalCapturePCM = false ;
AudioConfig.enableRecordExternalRenderPCM = false ;
/*
設定視頻設定
*/
AliRtcRecordVideoConfig VideoConfig ;
VideoConfig.sourceType = AliRtcVideosourceCameraType ;
VideoConfig.bitrate = view.bitrate ;
VideoConfig.fps = 20 ;
VideoConfig.quality = AliRtcVideoQualityDefault ;
Windows
AliEngineRecordFormat recordFormat = AliEngineRecordFormatMP4; // 錄製格式,音頻:AAC、WAV; 視頻: MP4
std::string filePath = "D:\\record_tmp\\record_video.mp4"; // 儲存路徑
// 音頻錄製配置
AliEngineRecordAudioConfig audioConfig;
audioConfig.sampleRate = AliEngineAudioSampleRate_48000; // 採樣率
audioConfig.quality = AliEngineAudioQualityHigh; // 音質越高檔案越大
audioConfig.externalPcmCaptureRecording = true; // 是否允許錄製外采音頻
audioConfig.externalPcmRenderRecording = true; // 是否允許錄製外部輸入的播放音頻
// 視頻錄製配置
AliEngineRecordVideoConfig videoConfig;
videoConfig.quality = AliEngineVideoQualityDefault;
// 目前的版本只支援複用編碼器模式
videoConfig.encodeMode = AliEngineRecordVideoReusingEncoderMode;
AliEngineRecordType recordType = AliEngineRecordTypeVideo;
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
)
})
})Mac
BOOL ret = [self.engine startRecord:AliRtcRecordTypeVideo recordFormat:AliRtcRecordFormatMP4
filePath:view.recordFilePath audioConfig:&AudioConfig videoConfig:&VideoConfig isFragment:FALSE] ;
Windows
mAliRtcEngine->StartRecord(recordType, recordFormat, filePath.c_str(), audioConfig, videoConfig, false);3. 停止錄製
開始錄製後,您可以調用stopRecord介面主動停止錄製。
Android
mAliRtcEngine.stopRecord();iOS
rtcEngine?.stopRecord()Mac
[self.engine stopRecord];Windows
mAliRtcEngine->StopRecord();4. 擷取錄製檔案
錄製完成後,可在指定路徑下找到產生的錄製檔案。開發人員可根據業務需求進一步處理該檔案,例如上傳到伺服器、播放回放或刪除臨時檔案。
確保應用具備訪問儲存空間的許可權(如 Android 上的
WRITE_EXTERNAL_STORAGE)。在低效能裝置上應適當降低錄製品質以避免影響通話體驗。