すべてのプロダクト
Search
ドキュメントセンター

ApsaraVideo Live:カスタムビデオキャプチャ

最終更新日:Nov 05, 2025

概要

Alibaba Real-Time Communication (ARTC) software development kit (SDK) は、柔軟なカスタムビデオキャプチャ機能を提供します。この機能により、ビジネスニーズに基づいてビデオキャプチャデバイスを管理できます。

まず ARTC SDK の内部キャプチャ機能を使用することを推奨します。内部キャプチャ機能が、ビデオ品質、デバイスの互換性、またはキャプチャプロセスの要件を満たさない場合は、カスタムビデオキャプチャ機能を使用できます。これにより、優れた拡張性とカスタマイズ機能が提供されます。

サンプルコード

Android 用カスタムビデオキャプチャ: Android/ARTCExample/AdvancedUsage/src/main/java/com/aliyun/artc/api/advancedusage/CustomVideoCaptureAndRender/CustomVideoCaptureActivity.java

iOS 用カスタムビデオキャプチャ: iOS/ARTCExample/AdvancedUsage/CustomVideoCapture/CustomVideoCpatureVC.swift

前提条件

ビデオ設定を行う前に、次の前提条件が満たされていることを確認してください:

実装

1. SDK の内部キャプチャを無効にする

enableLocalVideo メソッドを呼び出して、SDK の内部ビデオキャプチャを無効にできます。

Android

/* 内部キャプチャを無効にします。 */
mAliRtcEngine.enableLocalVideo(false);

/* 内部キャプチャを有効にします。 内部キャプチャはデフォルトで有効になっています。 この機能を制御する必要がない限り、このメソッドを呼び出す必要はありません。 */
mAliRtcEngine.enableLocalVideo(true);

iOS

/* 内部キャプチャを無効にします。 */
[_engine enableLocalVideo:NO];

/* 内部キャプチャを有効にします。 内部キャプチャはデフォルトで有効になっています。 この機能を制御する必要がない限り、このメソッドを呼び出す必要はありません。 */
[_engine enableLocalVideo:YES];

2. カスタムキャプチャのビデオソースを設定する

setExternalVideoSource を呼び出して、外部ビデオソースを設定できます。 主なパラメーターは次のとおりです:

  • enable: この機能を有効にするかどうかを指定します。

  • useTexture: テクスチャを入力として使用するかどうかを指定します。

  • streamType: SDK が置き換えるストリームを指定します。 カメラストリームまたは画面共有ストリームを指定できます。

  • renderMode: 外部ビデオソースの縦横比がアップストリーミングプロファイルと異なる場合に使用する処理モード。

Android

YUV 入力

/* YUV 形式の入力データ。 */
/* 外部キャプチャを有効にします。 この例では、カメラストリームを使用します。 必要に応じて、ソースタイプとレンダリングモードを指定します。 */
mAliRtcEngine.setExternalVideoSource(true,false, AliRtcVideoTrackCamera,AliRtcRenderModeAuto );

/* 外部キャプチャを無効にします。 この例では、カメラストリームを使用します。 必要に応じて、ソースタイプを指定します。 */
mAliRtcEngine.setExternalVideoSource(false,false, AliRtcVideoTrackCamera,AliRtcRenderModeAuto );

テクスチャ入力

/* テクスチャとしてデータを入力します。 */
/* 外部キャプチャを有効にします。 この例では、カメラストリームを使用します。 必要に応じて、ソースタイプとレンダリングモードを指定します。 */
mAliRtcEngine.setExternalVideoSource(true,true, AliRtcVideoTrackCamera,AliRtcRenderModeAuto );

/* 外部キャプチャを無効にします。 この例では、カメラストリームを使用します。 必要に応じて、ソースタイプを指定します。 */
mAliRtcEngine.setExternalVideoSource(false,true, AliRtcVideoTrackCamera,AliRtcRenderModeAuto );

iOS

/* 外部キャプチャを有効にします。 この例では、カメラストリームを使用します。 必要に応じて、ソースタイプとレンダリングモードを指定します。 */
[_engine setExternalVideoSource:YES sourceType:AliRtcVideosourceCameraType renderMode:AliRtcRenderModeAuto]; 

/* 外部キャプチャを無効にします。 この例では、カメラストリームを使用します。 必要に応じて、ソースタイプを指定します。 */
[_engine setExternalVideoSource:NO sourceType:AliRtcVideosourceCameraType renderMode:AliRtcRenderModeAuto]; 

3. SDK にデータを送信する

ビデオをキャプチャした後

Android

YUV 入力の例:

/* この例では YUV (I420) 形式を使用します。 */
int width = 720;
int height = 1280;
AliRtcEngine.AliRtcVideoFormat videoformat = AliRtcEngine.AliRtcVideoFormat.AliRtcVideoFormatI420;
int[] lineSize = {width, width / 2, width / 2, 0};
int frameLength = width * height * 3 / 2;
byte[] buffer = new byte[frameLength];

/* SDK に渡すデータオブジェクトを構築します。 */
AliRtcEngine.AliRtcRawDataFrame rawDataFrame
        = new AliRtcEngine.AliRtcRawDataFrame(buffer,
                                             videoformat,
                                             width, 
                                             height, 
                                             lineSize, 
                                             0, 
                                             buffer.length);

/* API を呼び出してデータオブジェクトを渡します。 */
int ret = mAliRtcEngine.pushExternalVideoFrame(rawDataFrame, AliRtcVideoTrackCamera);
if (ret != 0) {
    /* エラーメッセージを出力します。 */
}

テクスチャ入力の例:

/* この例ではテクスチャ形式を使用します。 */
/* OpenGL 環境を構築します。 */
private static EglBase14 createEglBase14(EGLContext shareEglContext) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        EglBase14.Context eglBase14Context = shareEglContext == null ? null : new EglBase14.Context(shareEglContext);
        EglBase14 eglBase14 = new EglBase14(eglBase14Context, EglBase.CONFIG_PIXEL_BUFFER);
        try {
            eglBase14.createDummyPbufferSurface();
            eglBase14.makeCurrent();
        } catch (RuntimeException e) {
            eglBase14.release();
            Log.e(TAG, "CreateEGLBase14Context, failed, " + e.getMessage());
        }
        return eglBase14;
    }
    return null;
}

/* 入力データのコンテキストを構築します。 */
float[] transformMatrix = {
  1, 0, 0, 0,
  0, 1, 0, 0,
  0, 0, 1, 0,
  0, 0, 0, 1
};
int frameWidth = 720; /* イメージの幅。 */
int frameHeight = 1280; /* イメージの高さ。 */
int textureID = xxx; /* テクスチャ ID。 */

AliRtcEngine.AliRtcRawDataFrame aliRawDataFrame 
  = new AliRtcEngine.AliRtcRawDataFrame(textureID,
                                        AliRtcVideoFormatTexture2D,
                                        frameWidth, 
                                        frameHeight, 
                                        transformMatrix, 
                                        0, 
                                        0, 
                                        frameWidth, 
                                        frameHeight, 
                                        mEglBase14.getEglContext());

/* API を呼び出してデータオブジェクトを渡します。 */
int ret = mAliRtcEngine.pushExternalVideoFrame(aliRawDataFrame, AliRtcVideoTrackCamera);
if (ret != 0) {
    /* エラーメッセージを出力します。 */
}

iOS

/* データ形式に基づいて次のパラメーターを指定します。 この例では I420 形式を使用します。 */
AliRtcVideoDataSample *dataSample = [[AliRtcVideoDataSample alloc] init];
dataSample.dataPtr = (long)yuv_read_data;
dataSample.format = AliRtcVideoFormat_I420;
dataSample.type = AliRtcBufferType_Raw_Data;
dataSample.width = width;
dataSample.height = height;
dataSample.strideY = width;
dataSample.strideU = width/2;
dataSample.strideV = width/2;
dataSample.dataLength = dataSample.strideY * dataSample.height * 3/2;

/* API を呼び出してデータオブジェクトを渡します。 */
int ret = [self.engine pushExternalVideoFrame:dataSample sourceType:AliRtcVideosourceCameraType];
if (ret != 0) {
    /* エラーメッセージを出力します。 */
}