# 自定义视频采集和渲染 (/zh-CN/api-reference/rtc/macos/video/video-custom-capturenrendering)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

<a id="toc_video_custom_capturenrendering"></a>

<a id="api_irtcengine_createcustomvideotrack"></a>

<a id="ariaid-title2"></a>

## createCustomVideoTrack [#createcustomvideotrack]

创建一个自定义视频轨道。

<a id="api_irtcengine_createcustomvideotrack__prototype"></a>

```objc
- (unsigned int)createCustomVideoTrack NS_SWIFT_NAME(createCustomVideoTrack());
```

<a id="api_irtcengine_createcustomvideotrack__detailed_desc"></a>

要发布自定义视频源，请按照以下步骤操作：

1. 调用该方法创建一个视频轨道，并获取视频轨道 ID。
2. 调用 `joinChannelByToken` 加入频道。在 [AgoraRtcChannelMediaOptions](/zh-CN/api-reference/rtc/macos/class-channelmediaoptions) 中，将 `customVideoTrackId` 设置为你想要发布的视频轨道 ID，并将 `publishCustomVideoTrack` 设置为 YES。
3. 调用 `pushExternalVideoFrame`，并将 `videoTrackId` 设置为第 2 步中设置的视频轨道 ID，即可在频道中发布对应的自定义视频源。

<a id="api_irtcengine_createcustomvideotrack__return_values"></a>

### 返回值 [#返回值]

- 方法调用成功时，返回视频轨道 ID，作为该视频轨道的唯一标识符。
- 方法调用失败时，返回 `0xffffffff`。

### 所属接口类 [#所属接口类]

- [AgoraRtcEngineKit](/zh-CN/api-reference/rtc/macos/rtc-interface-class#class_irtcengine)

<a id="api_irtcengine_destroycustomvideotrack"></a>

<a id="ariaid-title3"></a>

## destroyCustomVideoTrack: [#destroycustomvideotrack]

销毁指定的视频轨道。

<a id="api_irtcengine_destroycustomvideotrack__prototype"></a>

```objc
- (int)destroyCustomVideoTrack:(NSUInteger)videoTrackId NS_SWIFT_NAME(destroyCustomVideoTrack(_:));
```

<a id="api_irtcengine_destroycustomvideotrack__detailed_desc"></a>

<a id="api_irtcengine_destroycustomvideotrack__parameters"></a>

### 参数 [#参数]

<ParameterList>
<a id="videotrackid"></a>
<Parameter name="videoTrackId">

调用 [createCustomVideoTrack](/zh-CN/api-reference/rtc/macos/video/video-custom-capturenrendering#api_irtcengine_createcustomvideotrack) 方法返回的视频轨道 ID。

</Parameter>
</ParameterList>

<a id="api_irtcengine_destroycustomvideotrack__return_values"></a>

### 返回值 [#返回值-1]

- 0：方法调用成功。
- &lt; 0：方法调用失败。详见[错误码](/zh-CN/api-reference/rtc/error-code)了解详情和解决建议。

### 所属接口类 [#所属接口类-1]

- [AgoraRtcEngineKit](/zh-CN/api-reference/rtc/macos/rtc-interface-class#class_irtcengine)

<a id="api_irtcengine_pushvideoframe"></a>

<a id="ariaid-title4"></a>

## pushExternalVideoFrame\:videoTrackId: [#pushexternalvideoframevideotrackid]

通过视频轨道将外部原始视频帧推送到 SDK。

<a id="api_irtcengine_pushvideoframe__prototype"></a>

```objc
- (BOOL)pushExternalVideoFrame:(AgoraVideoFrame * _Nonnull)frame videoTrackId:(NSUInteger)videoTrackId NS_SWIFT_NAME(pushExternalVideoFrame(_:videoTrackId:));
```

<a id="api_irtcengine_pushvideoframe__detailed_desc"></a>

要发布自定义视频源，请按照以下步骤操作：

1. 调用 [createCustomVideoTrack](/zh-CN/api-reference/rtc/macos/video/video-custom-capturenrendering#api_irtcengine_createcustomvideotrack) 创建视频轨道并获取视频轨道 ID。
2. 调用 `joinChannelByToken` 加入频道。在 [AgoraRtcChannelMediaOptions](/zh-CN/api-reference/rtc/macos/class-channelmediaoptions) 中，将 `customVideoTrackId` 设置为要发布的视频轨道 ID，并将 `publishCustomVideoTrack` 设置为 YES。
3. 调用 [pushExternalVideoFrame\:videoTrackId:](/zh-CN/api-reference/rtc/macos/video/video-custom-capturenrendering#api_irtcengine_pushvideoframe) 方法，并将 `videoTrackId` 指定为第 2 步中设置的视频轨道 ID，即可在频道中发布相应的自定义视频源。

<a id="api_irtcengine_pushvideoframe__parameters"></a>

### 参数 [#参数-1]

<ParameterList>
<a id="frame"></a>
<Parameter name="frame">

要推送的外部原始视频帧。详见 [AgoraVideoFrame](/zh-CN/api-reference/rtc/macos/class-externalvideoframe)。

</Parameter>
<a id="videotrackid-1"></a>
<Parameter name="videoTrackId">

通过调用 [createCustomVideoTrack](/zh-CN/api-reference/rtc/macos/video/video-custom-capturenrendering#api_irtcengine_createcustomvideotrack) 方法返回的视频轨道 ID。

- 如果你只需推送一个自定义视频源，请将该参数设置为 0。

</Parameter>
</ParameterList>

<a id="api_irtcengine_pushvideoframe__return_values"></a>

### 返回值 [#返回值-2]

- YES：推送外部视频帧成功。
- NO：推送外部视频帧失败。

### 所属接口类 [#所属接口类-2]

- [AgoraRtcEngineKit](/zh-CN/api-reference/rtc/macos/rtc-interface-class#class_irtcengine)

<a id="api_irtcengine_pushvideoframe2"></a>

<a id="ariaid-title5"></a>

## pushExternalVideoFrame: [#pushexternalvideoframe]

将外部原始视频帧推送到 SDK。

<a id="api_irtcengine_pushvideoframe2__prototype"></a>

```objc
- (BOOL)pushExternalVideoFrame:(AgoraVideoFrame * _Nonnull)frame NS_SWIFT_NAME(pushExternalVideoFrame(_:)) __deprecated_msg("use pushExternalVideoFrame:frame,videoTrackId options instead.");
```

<a id="api_irtcengine_pushvideoframe2__detailed_desc"></a>

<a id="废弃"></a>

:::error[废弃]
该方法已废弃，请改用 `pushExternalVideoFrame:frame,videoTrackId`。
:::

调用 [setExternalVideoSource\:useTexture\:sourceType:](/zh-CN/api-reference/rtc/macos/video/video-custom-capturenrendering#api_irtcengine_setexternalvideosource) 方法，并将 `enabled` 参数设置为 YES，`encodedFrame` 参数设置为 NO 后，可以调用该方法将外部原始视频帧推送到 SDK。

<a id="api_irtcengine_pushvideoframe2__parameters"></a>

### 参数 [#参数-2]

<ParameterList>
<a id="frame-1"></a>
<Parameter name="frame">

要推送的外部原始视频帧。详见 [AgoraVideoFrame](/zh-CN/api-reference/rtc/macos/class-externalvideoframe)。

</Parameter>
</ParameterList>

<a id="api_irtcengine_pushvideoframe2__return_values"></a>

### 返回值 [#返回值-3]

- YES：方法调用成功。
- NO：方法调用失败。

### 所属接口类 [#所属接口类-3]

- [AgoraRtcEngineKit](/zh-CN/api-reference/rtc/macos/rtc-interface-class#class_irtcengine)

<a id="api_irtcengine_setexternalvideosource"></a>

<a id="ariaid-title6"></a>

## setExternalVideoSource\:useTexture\:sourceType: [#setexternalvideosourceusetexturesourcetype]

配置外部视频源。

<a id="api_irtcengine_setexternalvideosource__prototype"></a>

```objc
- (void)setExternalVideoSource:(BOOL)enable useTexture:(BOOL)useTexture sourceType:(AgoraExternalVideoSourceType)sourceType NS_SWIFT_NAME(setExternalVideoSource(_:useTexture:sourceType:));
```

<a id="api_irtcengine_setexternalvideosource__detailed_desc"></a>

调用该方法启用外部视频源后，可以调用 [pushExternalVideoFrame\:videoTrackId:](/zh-CN/api-reference/rtc/macos/video/video-custom-capturenrendering#api_irtcengine_pushvideoframe) 方法将外部视频数据推送到 SDK。

:::note
注： 频道内不支持动态切换视频源。如需从外部视频源切换为内部视频源，必须先离开频道，调用该方法关闭外部视频源，再重新加入频道。
:::

<a id="api_irtcengine_setexternalvideosource__timing"></a>

### 调用时机 [#调用时机]

该方法需要在加入频道前调用。

<a id="api_irtcengine_setexternalvideosource__parameters"></a>

### 参数 [#参数-3]

<ParameterList>
<a id="enable"></a>
<Parameter name="enable">

是否使用外部视频源：

- YES：使用外部视频源，SDK 准备接收外部视频帧。
- NO：（默认）不使用外部视频源。

</Parameter>
<a id="usetexture"></a>
<Parameter name="useTexture">

是否使用 Texture 格式的外部视频帧：

- YES：使用 Texture 格式的外部视频帧。
- NO：（默认）不使用 Texture 格式的外部视频帧。

</Parameter>
<a id="sourcetype"></a>
<Parameter name="sourceType">

外部视频帧的类型，详见 [AgoraExternalVideoSourceType](/zh-CN/api-reference/rtc/macos/enum-externalvideosourcetype)。

</Parameter>
</ParameterList>

### 所属接口类 [#所属接口类-4]

- [AgoraRtcEngineKit](/zh-CN/api-reference/rtc/macos/rtc-interface-class#class_irtcengine)
