falsestartVideoRecord() 使用默认参数开始录制startVideoRecord(options) 使用自定义参数开始录制true 表示 SDK 已受理本次录制请求false 表示当前没有有效会话、已有录制任务正在进行中,或开启水印但未传图片附件watermarkCoordinateEnabled 默认为 true,水印默认位于坐标 (0, 0)。需要使用 watermarkPosition 和 watermarkMarginX/Y 时,应显式设置为 false。坐标模式下位置枚举和边距不参与定位;超出画面的坐标会自动限制在画面内。由于录制帧使用 I420 色度采样,奇数坐标会向下对齐到相邻偶数像素。watermarkImageData 支持 Android BitmapFactory 可解析的 PNG、JPEG、WebP 等图片字节;透明 PNG 的 Alpha 会保留。调用方可从 ContentResolver.openInputStream(uri) 得到附件流并自行读取为 byte[]。| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
shouldDownload | boolean | 是 | true 时按持久化目录规则保存;false 时按缓存目录规则保存 |
callback | VideoRecordCallback | 否 | 停止录制后的结果回调 |
startVideoRecord(options) 中传入了 outputPath,则优先使用自定义路径callback.onError(...) 返回失败| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
durationMs | long | 是 | 录制片段时长,单位毫秒,必须大于 0 |
filename | String | 否 | 片段文件名;如果非空,会覆盖 options.filename |
callback | VideoRecordCallback | 否 | 片段录制完成后的结果回调 |
options | VideoRecordOptions | 否 | 录制参数 |
durationMs 后自动停止并回调结果true 表示当前存在进行中的录制任务false 表示当前没有录制任务| 字段 | 类型 | 说明 |
|---|---|---|
quality | int | 清晰度档位,范围 1-5 |
videoBitsPerSecond | int | 自定义视频码率 |
audioBitsPerSecond | int | 自定义 AAC 音频码率;<= 0 时使用默认 128000 bps |
bitsPerSecond | int | 自定义总码率,优先级高于 videoBitsPerSecond |
mimeType | String | 预留字段,当前版本未生效 |
filename | String | 输出文件名,为空时自动生成 |
outputPath | String | 自定义输出路径,支持完整文件路径和目录路径 |
timeslice | int | 预留字段,当前版本未生效 |
watermark | boolean | 是否启用图片附件水印,默认 false |
watermarkImageData | byte[] | 调用方提供的图片附件字节;启用水印时必填,SDK 不内置图片 |
watermarkPosition | int | 水印位置枚举,支持左上、右上、左下、右下;字段默认右下,仅关闭坐标模式后生效 |
watermarkCoordinateEnabled | boolean | 是否使用绝对坐标定位,默认 true;关闭时使用位置枚举和边距 |
watermarkX | int | 坐标模式下水印左上角的横坐标,默认 0 |
watermarkY | int | 坐标模式下水印左上角的纵坐标,默认 0 |
watermarkWidth | int | 水印目标宽度(视频像素);<= 0 使用图片原始宽度并在超出画面时等比缩小 |
watermarkMarginX | int | 位置枚举模式下距对应水平边缘的像素距离,默认 16 |
watermarkMarginY | int | 位置枚举模式下距对应垂直边缘的像素距离,默认 16 |
watermarkOpacity | float | 整体透明度 0-1,默认 1.0;与图片自身 Alpha 共同生效 |
quality、videoBitsPerSecond、audioBitsPerSecond、bitsPerSecond、filename、outputPath 和录制水印字段均已生效bitsPerSecond 和 videoBitsPerSecond,以 bitsPerSecond 为准WATERMARK_POSITION_TOP_LEFT、WATERMARK_POSITION_TOP_RIGHT、WATERMARK_POSITION_BOTTOM_LEFT、WATERMARK_POSITION_BOTTOM_RIGHTVideoRecordOptions.copy() 会复制附件字节,录制开始后调用方修改原数组不会改变本次水印| 字段 | 类型 | 说明 |
|---|---|---|
file | File | 输出文件对象 |
path | String | 输出文件绝对路径 |
filename | String | 文件名 |
size | long | 文件大小,单位字节 |
type | String | 当前固定为 video/mp4 |
durationMs | long | 录制时长,单位毫秒 |
width | int | 导出视频宽度 |
height | int | 导出视频高度 |
persisted | boolean | 是否按持久化目录规则保存 |
onSuccess(...) 在录制成功结束后回调onError(...) 在录制失败时回调VideoRecordCallback.onSuccess(...)VideoRecordCallback.onError(...)JyGameStatusListener.onEvent(int code, String msg) 立即发出警告事件| 字段 | 值 |
|---|---|
code | JyCode.WRN_VIDEO_RECORD_AUDIO_FALLBACK(30005) |
msg | AAC 编码器初始化失败: <设备异常信息> |
| 含义 | 当前录制已降级为无声视频,业务方可提示用户,但无需主动停止录制 |
VideoRecordCallback.onError(...) 返回。API 19 及以上COLOR_FormatYUV420Planar(I420)或 COLOR_FormatYUV420SemiPlanar(NV12)输入30fps 和目标码率| 环境 | 验证状态 | 结果 |
|---|---|---|
| 小米 M2002J9E / Android 11 / Qualcomm | 真机端到端录制 | 1080p、音画同步、无绿屏,实际约 29.74fps |
| AOSP arm64 模拟器 / Android 14 | 编码能力 检查 | H.264、AAC 和当前使用的标准 YUV 格式匹配;未替代多品牌真机录制验证 |
| 风险机型或场景 | 当前行为 | 影响 |
|---|---|---|
H.264 编码器只提供 COLOR_FormatYUV420Flexible 或厂商私有 YUV 格式 | 当前不会选用该编码器 | 录制启动失败,但避免把私有内存布局误当 NV12 导致绿屏 |
低端或较老设备不支持输入分辨率、30fps 或目标码率 | 当前尚未在初始化前完整调用 VideoCapabilities 做预检和自动降级 | 可能配置失败、掉帧或录制不流畅 |
| MediaTek、Samsung Exynos、Android 4.4/5.x、Android TV | 尚无完整真机矩阵 | 不能对外承诺全部兼容 |
| AAC 创建、配置或启动失败 | 自动降级为无声视频并回调 30005 | 保住视频文件,但没有音轨 |
| AAC 启动后的运行期编码异常 | 结束录制并返回失败 | 当前没有运行期音频降级 |
/api/report 通道,接入方不需要额外调用接口。video_record|event=<event>|key=value|...event | code | 触发时机 | 关键字段 |
|---|---|---|---|
start | game_event | 开始请求已受理 | status=accepted、quality、video_bitrate、total_bitrate、audio_bitrate、custom_output |
audio_fallback | game_event | AAC 初始化失败并降级 | status=degraded、reason |
error | game_exception | 开始/停止请求被拒绝,或录制过程异常 | stage、status/message/reason |
end | game_event | 录制生命周期结束 | status=success/failed/cancelled;成功时还包含 duration_ms、size_bytes、width、height、audio、persisted |
start 表示 SDK 已受理录制,不等同于编码器已产出第一帧error 和 end(status=failed),便于后台同时统计异常原因和生命周期闭环end(status=cancelled)outputPath 为空时:| 场景 | 默认路径 |
|---|---|
stopVideoRecord(true, ...) | externalFilesDir/Movies/WhaleCloud |
stopVideoRecord(false, ...) | cacheDir/whalecloud/record |
outputPath 不为空时,优先使用自定义路径。/ 结尾filesDir 下_1、_2 等后缀,避免覆盖| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
options | VideoScreenshotOptions | 否 | 截图参数 |
callback | VideoScreenshotCallback | 否 | 截图结果回调 |
| 字段 | 类型 | 说明 |
|---|---|---|
format | String | 导出格式,支持 jpeg、jpg、png,默认 png(无损) |
jpegQuality | float | JPEG 压缩质量,范围 0-1,默认 1.0,仅 jpeg/jpg 生效 |
maxWidth | int | 导出图片最大宽度,默认 0;<= 0 表示不限制 |
maxHeight | int | 导出图片最大高度,默认 0;<= 0 表示不限制 |
shouldDownload | boolean | true 时按持久化目录规则保存;false 时按缓存目录规则保存 |
filename | String | 输出文件名,为空时自动生成 |
outputPath | String | 自定义输出路径,支持完整文件路径和目录路径 |
watermark | boolean | 预留字段,当前版本未生效 |
format、jpegQuality、maxWidth、maxHeight、shouldDownload、filename、outputPath 为当前版本可用字段maxWidth、maxHeight 都不限制时,普通渲染模式按解码帧旋转后的原始像素尺寸导出,不进行二次缩放format 为空或传入不支持的值时按默认 png 处理1.0 仍属于有损编码;要求截图文件不再产生有损压缩时请使用 png| 字段 | 类型 | 说明 |
|---|---|---|
file | File | 输出文件对象 |
path | String | 输出文件绝对路径 |
filename | String | 文件名 |
size | long | 文件大小,单位字节 |
type | String | image/jpeg 或 image/png |
url | String | 文件 URI 字符串 |
width | int | 导出图片宽度 |
height | int | 导出图片高度 |
persisted | boolean | 是否按持久化目录规则保存 |
onSuccess(...) 在截图成功后回调onError(...) 在截图失败时回调outputPath 为空时:| 场景 | 默认路径 |
|---|---|
shouldDownload = true | externalFilesDir/Pictures/WhaleCloud |
shouldDownload = false | cacheDir/whalecloud/screenshot |
outputPath 不为空时,优先使用自定义路径。/ 结尾filesDir 下_1、_2 等后缀,避免覆盖durationMs <= 0onError(int code, String msg)。30fps;输入流帧率不足时以实际输入帧率为准onEvent(30005, ...) 提醒H.265,当前录制结果仍为 H.264 mp4watermarkImageData 动态提供,不会被写死或打包在 SDK 中jpeg/jpg/pngwatermark 为预留字段,当前版本未生效PixelCopy 抓取视频 Surface;导出尺寸以视频 Surface 为准png 可避免导出阶段再次进行有损压缩