Avatar 虚拟形象
  • iOS
  • Android : Java
  • 产品简介
  • 下载
  • 下载体验 App
  • 快速开始
    • 跑通示例源码
    • 集成 SDK
    • 创建虚拟形象
  • 基本功能
  • 最佳实践
  • 客户端 API
  • 服务端 API
  • 常见错误码
  • 常见问题
  • 文档中心
  • Avatar 虚拟形象
  • 基本功能
  • 视频录制

视频录制

更新时间:2023-08-02 18:38

功能简介

ZEGO Avatar SDK 提供了视频录制功能,支持用户随时把 Avatar 虚拟形象录制成视频,同时也可以将麦克风采集的声音录制到视频中。

用户可以把 Avatar 的精彩时刻,录制成视频,分享给好友。

前提条件

在实现“录制视频”功能之前,请确保:

  • 已在项目中集成了 Avatar SDK,详情请参考 集成 SDK
  • 已参考 创建虚拟形象,完成基本的虚拟人物形象搭建。

实现流程

开发者请参考以下步骤,实现 “录制视频” 功能。

1 启动视频录制

开始视频录制前,如果要保存到设备上,请先配置 WRITE_EXTERNAL_STORAGE 权限。录制接口只支持传入保存视频文件的绝对路径。

配置方法请参考 设置权限

搭建出基本的虚拟人物形象后,调用 ZegoAvatarViewstartRecord 接口,传入录制视频的配置参数 ZegoRecordConfig,其中 videoPath 指视频保存路径,必填。默认录制视频为 .mp4 格式。

ZegoRecordConfig recordConfig = new ZegoRecordConfig();
// 可选: 默认为 MP4 格式, 也可以录制为 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 停止视频录制

如果想要停止录制,可调用 ZegoAvatarViewstopRecord 接口停止录制,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 进行音频采集,请参考 自定义音频采集与渲染

  1. 开发者需要调用 setCustomAudioDelegate 接口,设置自定义音频数据采集代理(需要继承 AudioDataDelegate 实现 onStartonStop 方法)。
  2. 采集到音频数据后,调用 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 SDK 的自定义音频采集的前处理回调, 将采集到的数据发送给 Avatar SDK
    public void onProcessCapturedAudioData(ByteBuffer data, int dataLength, ZegoAudioFrameParam param) {
        if(isRunning){
            // data: pcm 的原始数据
            // length: data 的长度
            // dataType: data 采集的位数:0 表示 16 位,1 表示 8 位
            // timeStamp: 时间戳, 从启动采集到现在经过的时间,单位 毫秒
            // sendAudioData 是父类方法, 直接调用即可;数据透传给 Avatar SDK, RTC 的数据是 8 位的, dataType 是 1
            super.sendAudioData(data, dataLength, 1, super.getDurationMs());
        }
    }
}
本篇目录