想拍视频,不想露脸?
虚拟人视频录制
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)