概要
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。
前提条件
ビデオ設定を行う前に、次の前提条件が満たされていることを確認してください:
有効な Alibaba Cloud アカウントを所有し、リアルタイム音声・映像アプリケーションを作成済みであること。 詳細については、「アプリケーションの作成」をご参照ください。 App ID と App Key は リアルタイム音声・映像コンソールで取得できます。
ARTC SDK をプロジェクトに統合し、基本的な音声・映像通信機能を実装済みであること。 SDK を統合する方法の詳細については、「SDK のダウンロードと統合」をご参照ください。 音声・ビデオ通話の実装方法の詳細については、「音声・ビデオ通話の実装」をご参照ください。
実装
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) {
/* エラーメッセージを出力します。 */
}