自定义视频采集和渲染
- Android
更新时间不可用
createCustomVideoTrack
创建一个自定义视频轨道。
public abstract int createCustomVideoTrack();调用该方法创建一个视频轨道,并获取视频轨道 ID。该 ID 可用于发布自定义视频源。要发布自定义视频源,请按照以下步骤操作:
- 调用该方法创建一个视频轨道,并获取视频轨道 ID。
- 调用
joinChannel加入频道。在 ChannelMediaOptions 中,将customVideoTrackId设置为要发布的视频轨道 ID,并将publishCustomVideoTrack设置为 true。 - 调用
pushExternalVideoFrameById,并将videoTrackId设置为第 2 步中指定的视频轨道 ID,即可在频道中发布对应的自定义视频源。
返回值
- 方法调用成功,返回视频轨道的唯一标识符,即视频轨道 ID。
- 方法调用失败,返回 0xffffffff。
所属接口类
destroyCustomVideoTrack
销毁指定的视频轨道。
public abstract int destroyCustomVideoTrack(int video_track_id);参数
| 参数名 | 描述 |
|---|---|
video_track_id | 调用 createCustomVideoTrack 返回的视频轨道 ID。 |
返回值
- 0:方法调用成功。
- < 0:方法调用失败。详见错误码了解详情和解决建议。
所属接口类
isTextureEncodeSupported
检查视频是否支持 Texture 编码。
public abstract boolean isTextureEncodeSupported();返回值
- true:支持
Texture编码。 - false:不支持
Texture编码。
所属接口类
pushExternalVideoFrameById [1/2]
通过视频轨道向 SDK 推送外部原始视频帧。
public abstract int pushExternalVideoFrameById(VideoFrame frame, int videoTrackId);在 Android 自采集场景中,声网推荐优先使用 io.agora.base.VideoFrame 配合 pushExternalVideoFrameById(VideoFrame frame, int videoTrackId) 推送视频帧。VideoFrame 支持通过统一的 Buffer 抽象封装 I420、NV21、NV12 和 Texture 等数据,适合新接入场景。
如果你只需向当前频道发布一路自采集视频,推荐在加入频道前调用 setExternalVideoSource 启用外部视频源,并在 ChannelMediaOptions 中将 publishCustomVideoTrack 设置为 true、将 customVideoTrackId 设置为 0。此场景下,SDK 会自动创建默认自定义视频轨道,你无需先调用 createCustomVideoTrack。
如果你需要发布多路自采集视频,或者需要在多个频道中分别发布不同的自采集视频流,请按照以下步骤操作:
- 调用 createCustomVideoTrack 创建视频轨道并获取视频轨道 ID。
- 调用
joinChannel加入频道。在 ChannelMediaOptions 中,将customVideoTrackId设置为要发布的视频轨道 ID,并将publishCustomVideoTrack设置为 true。 - 调用
pushExternalVideoFrameById,并将videoTrackId设置为第 2 步中设置的视频轨道 ID,即可在频道中发布对应的自定义视频源。
如果你的现有采集模块已经基于 AgoraVideoFrame 封装,仍可继续调用 pushExternalVideoFrameById(AgoraVideoFrame frame, int videoTrackId);但该重载不支持 Texture 数据,且可扩展能力弱于 VideoFrame。你可以通过调用 pushExternalVideoFrameById 或调用 pushExternalVideoFrameById(参数为 AgoraVideoFrame)推送视频帧。
注: 如果你只需向频道中推送一个自定义视频源,可以直接调用 setExternalVideoSource,SDK 会自动创建一个 videoTrackId 为 0 的视频轨道。
危险:调用本方法后,即使你停止向 SDK 推送外部视频帧,自定义视频流仍会计入视频时长并产生费用。声网建议你根据实际情况采取适当措施以避免此类视频计费:
- 如果你不再需要采集外部视频数据,可以调用 destroyCustomVideoTrack 销毁自定义视频轨道。
- 如果你只想将外部视频数据用于本地预览而不发布到频道中,可以调用 muteLocalVideoStream 取消发送视频流,或调用 updateChannelMediaOptions 将
publishCustomVideoTrack设置为 false。
参数
| 参数名 | 描述 |
|---|---|
frame | 要推送的视频帧。详见 VideoFrame。 |
videoTrackId |
返回值
- 0:方法调用成功。
- < 0:方法调用失败。详见错误码了解详情和解决建议。
所属接口类
pushExternalVideoFrame [1/2]
将外部原始视频帧推送至 SDK。
public abstract boolean pushExternalVideoFrame(VideoFrame frame)废弃
该方法已废弃。
调用 setExternalVideoSource 方法并将 enabled 参数设置为 true,encodedFrame 参数设置为 false 后,可以使用该方法将外部原始视频帧推送至 SDK。你可以调用该方法或 pushExternalVideoFrame 推送视频帧。
注: 在 Android 自采集场景中,声网推荐优先使用 io.agora.base.VideoFrame 配合 pushExternalVideoFrameById(VideoFrame frame, int videoTrackId) 推送视频帧。VideoFrame 支持通过统一的 Buffer 抽象封装 I420、NV21、NV12 和 Texture 等数据,适合新接入场景;AgoraVideoFrame 更适合兼容现有基于字节数组的推帧实现。
参数
| 参数名 | 描述 |
|---|---|
frame | 要推送的视频帧。详见 VideoFrame。 |
返回值
- true:推送视频帧成功。
- false:推送视频帧失败。
所属接口类
pushExternalVideoFrameById [2/2]
通过视频轨道向 SDK 推送外部原始视频帧。
public abstract int pushExternalVideoFrameById(AgoraVideoFrame frame, int videoTrackId);如果你的现有采集模块已经基于 AgoraVideoFrame 封装,可继续调用该重载推送视频帧。
如果你只需向当前频道发布一路自采集视频,推荐在加入频道前调用 setExternalVideoSource 启用外部视频源,并在 ChannelMediaOptions 中将 publishCustomVideoTrack 设置为 true、将 customVideoTrackId 设置为 0。此场景下,SDK 会自动创建默认自定义视频轨道,你无需先调用 createCustomVideoTrack。
如果你需要发布多路自采集视频,或者需要在多个频道中分别发布不同的自采集视频流,请按照以下步骤操作:
- 调用 createCustomVideoTrack 创建视频轨道并获取视频轨道 ID。
- 调用
joinChannel加入频道。在 ChannelMediaOptions 中,将customVideoTrackId设置为要发布的视频轨道 ID,并将publishCustomVideoTrack设置为 true。 - 调用
pushExternalVideoFrameById,并将videoTrackId设置为步骤 2 中设置的视频轨道 ID,即可在频道中发布对应的自定义视频源。
AgoraVideoFrame 更适合兼容现有基于字节数组的推帧实现;如果你是新接入场景,声网更推荐使用 pushExternalVideoFrameById(VideoFrame frame, int videoTrackId) 重载,因为它支持 Texture 数据,且可通过统一的 Buffer 抽象封装更多格式。你可以通过调用 pushExternalVideoFrameById 或调用 pushExternalVideoFrame 推送视频帧。
注: 如果你只需向频道中推送一个自定义视频源,可以直接调用 setExternalVideoSource 方法,SDK 会自动创建一个 videoTrackId 为 0 的视频轨道。
警告:调用 pushExternalVideoFrameById 后,即使你停止向 SDK 推送外部视频帧,自定义视频流仍会被计入视频时长并产生费用。声网建议你根据实际情况采取适当措施以避免此类视频计费:
- 如果你不再需要采集外部视频数据,可以调用 destroyCustomVideoTrack 销毁自定义视频轨道。
- 如果你只想将外部视频数据用于本地预览而不在频道中发布,可以调用 muteLocalVideoStream 取消发送视频流,或调用 updateChannelMediaOptions 将
publishCustomVideoTrack设置为 false。
参数
| 参数名 | 描述 |
|---|---|
frame | 要推送的外部原始视频帧。详见 AgoraVideoFrame。 |
videoTrackId |
返回值
- 0:方法调用成功。
- < 0:方法调用失败。详见错误码了解详情和解决建议。
所属接口类
pushExternalVideoFrame [2/2]
将外部原始视频帧推送至 SDK。
public abstract boolean pushExternalVideoFrame(AgoraVideoFrame frame)废弃
自 v4.5.0 版本废弃。
调用 setExternalVideoSource 方法并将 enabled 参数设置为 true,encodedFrame 参数设置为 false 后,可以使用 pushExternalVideoFrame 将外部原始视频帧推送至 SDK。你也可以调用 pushExternalVideoFrame 推送视频帧。
参数
| 参数名 | 描述 |
|---|---|
frame | 要推送的外部原始视频帧。详见 AgoraVideoFrame。 |
返回值
- true:推送成功。
- false:推送失败。
所属接口类
setExternalRemoteEglContext
设置用于渲染远端视频流的 EGL 上下文。
public abstract int setExternalRemoteEglContext(Object eglContext);该方法用于替换 SDK 默认的远端 EGL 上下文,便于你自行管理 EGL 上下文。当引擎销毁时,SDK 会自动释放该上下文。
适用场景
该方法适用于使用自定义渲染方式(如 Texture 格式)替代 SDK 默认渲染方式渲染远端视频帧的场景。
调用时机
请在加入频道前调用该方法。
参数
返回值
- 0:方法调用成功。
- < 0:方法调用失败。详见错误码了解详情和解决建议。
所属接口类
setExternalVideoSource
配置外部视频源。
public abstract int setExternalVideoSource(boolean enable, boolean useTexture, Constants.ExternalVideoSourceType sourceType);调用该方法后,可以调用 pushExternalVideoFrameById 向 SDK 推送外部视频数据。
注: 频道内不支持动态切换视频源。若需从外部视频源切换为内部视频源,必须先离开频道,调用该方法关闭外部视频源,再重新加入频道。
调用时机
请在加入频道前调用该方法。
参数
| 参数名 | 描述 |
|---|---|
enable | |
useTexture | |
sourceType | 外部视频帧是否为编码格式,详见 ExternalVideoSourceType。 |
返回值
- 0:方法调用成功。
- < 0:方法调用失败。详见错误码了解详情和解决建议。