想拍視頻,不想露臉?
虛擬人視頻錄制
ZEGO Avatar SDK 虛擬形象 SDK 提供了視頻錄制功能,支持用戶隨時把 Avatar 虛擬形象錄制成視頻,同時也可以將麥克風采集的聲音錄制到虛擬形象視頻中,
用戶可以把 Avatar虛擬人 的精彩時刻,錄制成視頻,分享給好友,
實作視頻錄制的前提條件
在實作“錄制視頻”功能之前,請確保:
- 已在專案中集成了 Avatar SDK 虛擬形象 SDK,詳情請參考 集成 SDK,
- 已參考 創建虛擬形象,完成基本的虛擬人物形象搭建,
虛擬人視頻錄制的實作流程
開發者請參考以下步驟,實作 “錄制視頻” 功能,
1 啟動虛擬人視頻錄制
開始視頻錄制前,如果要保存到設備上,請先配置 WRITE_EXTERNAL_STORAGE 權限,錄制介面只支持傳入保存視頻檔案的絕對路徑,
配置方法請參考 設定權限,
搭建出基本的虛擬人物形象后,呼叫 ZegoAvatarView 的 startRecord 介面,傳入錄制視頻的配置引數 ZegoRecordConfig,其中 videoPath 指視頻保存路徑,必填,默認錄制視頻為 .mp4 格式,
ZegoRecordConfig recordConfig = new ZegoRecordConfig();
// 可選: 默認就是MP4, 除了MP4還能錄制Webm, 但是Webm的設備兼容性太差, 且錄制出來的視頻, 在 iOS 也缺少原生支持, 不建議使用
recordConfig.recordMode = ZegoRecordConfig.MODE_MP4;
// 可選: 把聲音也錄制上
recordConfig.recordAudio = true;
// 注意: 華為手機要寫入相冊, 要在 AndroidManifest.xml 中的 application 增加這個 android:requestLegacyExternalStorage="true", 否則沒有權限
// 設定存盤路徑, 可以存盤在相冊或者其它位置. 以下示例為相冊的存盤路徑示例, 通知相冊的邏輯, 用戶自定義即可
mVideoFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() + File.separator + System.currentTimeMillis() + ".mp4";
// 必填: 保存到相冊, 需要確保已經在 AndroidManifest.xml 已經申請過 WRITE_EXTERNAL_STORAGE 權限
recordConfig.setVideoPath(mVideoFile);
// 可選: 視頻錄制默認是 mAvatarView 的尺寸, 如果覺得錄制視頻的尺寸太大, 可以通過設定 scaleWidth 來限制最大寬度, 高度則按比例縮小
// 注意: scaleWidth 必須小于 mAvatarView 的寬度
recordConfig.setScaleWidth(mAvatarView.getWidth() / 2);
// 啟動錄制, 當啟動失敗回傳false(沒有權限、創建編碼器出錯等),由于錄制是在子執行緒進行的, 錄制程序中有錯誤(編碼失敗等錯誤), 會通過 callback 回到出來
// 注:mAvatarView 為 ZegoAvatarView 的實體
mAvatarView.startRecord(recordConfig, (errorCode, msg) -> {
Log.e("ZegoAvatar", "Avatar 形象視頻錄制出錯了: " + msg);
});
啟動錄制失敗時,介面會回傳 false(失敗原因可能為:沒有權限、創建編碼器出錯等),之后編碼運行在子執行緒,錄制程序中若發生錯誤,會在 callback 中回呼出來,相關錯誤碼請參考 常見錯誤碼,
2 停止視頻錄制
如果想要停止錄制,可呼叫 ZegoAvatarView 的 stopRecord 介面停止錄制,SDK 會把視頻內容保存成視頻檔案,復制到 videoPath 指定的路徑中,
// 停止視頻錄制, 呼叫后會停止錄制, 并把錄制的視頻檔案寫到 startRecord 時指定的 videoPath
// 如果程序中發生錯誤, 會在 callback 中回呼出來
mAvatarView.stopRecord((errorCode, msg) -> {
if (errorCode == 0) {
Log.i("ZegoAvatar", "Avatar 形象視頻錄制成功, 保存路徑: " + mVideoFile);
} else {
Log.i("ZegoAvatar", "Avatar 形象視頻錄制失敗: " + msg);
}
});
3 自定義音頻采集
如果設定了 ZegoRecordConfig 物件的 recordAudio 為 true,SDK 會使用內置的麥克風采集模塊采集聲音,內置的采集模塊在設備兼容性上有所欠缺,ZEGO 推薦開發者使用 Express SDK 進行音頻采集,請參考 自定義音頻采集與渲染,
- 開發者需要呼叫
setCustomAudioDelegate介面,設定自定義音頻資料采集代理(需要繼承AudioDataDelegate實作onStart和onStop方法), - 采集到音頻資料后,呼叫
sendAudioData介面,發送資料,
- 如果錄制視頻的同時,也開起了“語音驅動”,且語音驅動也已開啟“自定義音頻采集”,則
setCustomAudioDelegate介面只需設定一次即可,SDK 會進行復用,無需重復設定, - 開發者如果使用 Express SDK 做音頻采集,可以參考示例原始碼中的 “im/zego/zegoavatarexample/express/ZegoExpressAudioCaptureDelegate.java” 檔案,其代碼已實作通過 Express SDK 的自定義音頻前處理,把音頻資料提供給 Avatar 做視頻錄制的邏輯,
public class CustomAudioDataDelegate extends AudioDataDelegate {
private Boolean isRunning = false;
@Override
public void onStart() {
// 啟動音頻采集
isRunning = true;
// 配置 Express ,啟動自定義音頻前處理等等
}
@Override
public void onStop() {
// 停止音頻采集
isRunning = false;
}
// 這個是 Express 的聲音前處理回呼, 這里直接把Express 采集的資料給到 Avatar SDK即可,
public void onProcessCapturedAudioData(ByteBuffer data, int dataLength, ZegoAudioFrameParam param) {
if(isRunning){
// 填充聲音資料
// data: pcm的原始資料
// length: data的長度
// dataType: data采集的位數 0表示16位,1表示8位
// timeStamp: 時間戳, 從啟動采集到當前經過的時間, 單位毫秒,
super.sendAudioData(data, dataLength, 1/*rtc 給的資料是 8位的, 填 1*/, super.getDurationMs()/*這是個父類方法,直接呼叫即可,*/);
}
}
}
4 獲取Avatar SDK更多幫助
獲取本文 Avatar SDK的開發檔案、技術支持,訪問即構檔案中心開發檔案頁
音視頻場景解決方案分享,更多詳情可搜索官網(https://zegoguanwang.datasink.sensorsdata.cn/t/pB)轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/517608.html
標籤:其他
上一篇:專業3d建模渲染工具:3ds max 2023 win版
下一篇:leetcode 380. Insert Delete GetRandom O(1) O(1) 時間插入、洗掉和獲取隨機元素 (中等)
