想拍视频,不想露脸?
虚拟人视频录制
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 的开发文档、技术支持,拜访即构文档核心开发文档页