ショートビデオ SDK は、基本的な録画機能に加えて、マルチソース録画機能を強化しています。これにより、ビュー録画 (画面録画) がサポートされ、カメラフィードやビュー録画などの複数のビデオソースを組み合わせて合成ビデオを作成できます。
サポートするエディション
エディション | サポート状況 |
Professional | はい |
Standard | はい |
Basic | いいえ |
基本概念
関連クラス
クラス | 説明 |
マルチソース録画のコアクラスです。録画、プレビュー設定、エフェクト設定、コールバック処理などの主要な機能を提供します。 | |
ビデオ録画インスタンスを作成するためのファクトリークラスです。 | |
ビデオ解像度、エンコーダータイプ、フレームレートなどの録画パラメーターを定義します。 | |
ビデオデータキャプチャを設定するためのインターフェイスです。カメラ録画およびビュー録画のキャプチャラーを追加するメソッドが含まれています。 | |
カメラ録画用のインターフェイスです。 | |
ビュー録画用のインターフェイスです。 | |
録画の完了、進捗、およびエラーに関するコールバックを含む、録画リスナー用のインターフェイスです。 | |
PCM フォーマットのオーディオデータを提供するオーディオコールバックインターフェイスです。 | |
カメラデータキャプチャ用のコールバックインターフェイスです。プレビュー解像度の選択、キャプチャされたフレーム、カメラ起動失敗などのコールバックが含まれます。 | |
写真撮影およびスクリーンショット用のコールバックインターフェイスです。 | |
クリップの削除や録画時間の設定など、ビデオクリップを管理するためのインターフェイスです。 |
操作手順
マルチソース録画を使用するには、カメラとマイクの権限を付与する必要があります。権限がない場合、録画は失敗します。
フェーズ | ステップ | 説明 | サンプルコード |
基本 | 1 | 録画インスタンスの作成と破棄、および録画パラメーターの設定。 | |
2 | ビュー録画とカメラ録画のパラメーターの設定。 | ||
3 | コールバックの設定。 | ||
4 | プレビュービューの設定とプレビューの有効化。 | ||
5 | ビデオクリップの録画開始、停止、キャンセル。 | ||
6 | 録画を終了して最終的なビデオを生成。 | ||
高度 | 7 | カメラコントロール (カメラタイプやフラッシュモードなど) とクリップ管理パラメーター (最大/最小録画時間、クリップの削除、クリップ数のクエリなど) の設定。これらの設定は任意です。 | |
8 | 任意で、レタッチ、フィルター、アニメーションスタンプなどの録画エフェクトを設定。 | ||
9 | BGM、背景画像、可変速再生の設定。 |
初期化とパラメーターの設定
AliyunIVideoRecorder クラスを初期化し、録画インスタンスを作成し、録画パラメーターを設定します。コードパラメーターの詳細については、「関連クラス」をご参照ください。
クラスの初期化
// 録画インスタンスを作成します。
AliyunIVideoRecorder recorder = AliyunMultiRecorderCreator.getVideoRecorderInstance(context, config);
// 録画インスタンスを破棄します。
// SDK が不要になった場合、またはアプリケーションを終了する前にこのメソッドを呼び出します。
// Activity#onDestroy で呼び出すことを推奨します。録画セッション中にインスタンスを破棄しないでください。
recorder.destroy();録画パラメーターの設定
AliyunVideoRecorderConfig config = AliyunVideoRecorderConfig.builder()
// 必須パラメーター
.videoWidth(***)
.videoHeight(***)
.outputPath(***)
// 任意パラメーター
.***()
.***()
.build();ビデオソースの設定
必要に応じて複数のビデオソースを組み合わせます。ソースを追加した後、recorder.prepare() を呼び出して追加が完了したことを示します。
カメラ録画
API パラメーターの詳細については、AliyunICameraCapture をご参照ください。
// 1. レイアウトを設定します。
AliyunLayoutParam cameraLayoutParam = AliyunLayoutParam.builder()
.layoutLevel(***)
.centerX(***)
.centerY(***)
.widthRatio(***)
.heightRatio(***)
.displayMode(***)
.build();
// 2. ビデオソースを追加します。
AliyunICameraCapture cameraCapture = recorder.getVideoCapture().addCameraCapture(cameraLayoutParam);
// 3. ビデオソースを設定します。
// カメラのプレビュービューを設定します。これは必須のプロパティです。
cameraCapture.setDisplayView(SurfaceView)
// その他の設定 (必要に応じて設定)。
cameraCapture.set***();ビュー録画
API パラメーターの詳細については、AliyunIViewCapture をご参照ください。
// 1. レイアウトを設定します。
AliyunLayoutParam viewLayoutParam = AliyunLayoutParam.builder()
.layoutLevel(***)
.centerX(***)
.centerY(***)
.widthRatio(***)
.heightRatio(***)
.displayMode(***)
.build();
// 2. ビデオソースを追加します。
// 現在の録画ビューを取得します。
View recordView = getRecordView();
AliyunIViewCapture viewCapture = recorder.getVideoCapture().addViewCapture(viewLayoutParam, recordView);
// 3. ビデオソースを設定します (必要に応じて)。
viewCapture.set***();ビデオソースの準備
すべてのビデオソースを追加した後、次のメソッドを呼び出して設定を完了します。
recorder.prepare();コールバックの設定
コールバックを設定して、オーディオとビデオの処理に関するリアルタイムのステータス更新を取得します。コードで使用されるパラメーターの詳細については、「関連クラス」の API リファレンスをご参照ください。
// 録画コールバックを設定します (任意)。
recorder.setOnRecordListener(OnVideoRecordListener);
// キャプチャされたオーディオデータのコールバックを設定します (任意)。
recorder.setOnAudioCallback(OnAudioCallback);プレビューの有効化
通常、Activity#onResume で startPreview を呼び出し、Activity#onPause で stopPreview を呼び出します。コードで使用されるパラメーターの詳細については、「関連クラス」の API リファレンスをご参照ください。
// プレビューを開始します。
// 通常、Activity#onResume で呼び出されます。
AliyunIRecorder.startPreview();
// プレビューを停止します。
// 通常、Activity#onPause で呼び出されます。
AliyunIRecorder.stopPreview();録画の開始
録画中に、停止、キャンセル、再開を複数回行うことができます。録画を停止するとビデオクリップが保存され、キャンセルすると現在のクリップが破棄されます。コードで使用されるパラメーターの詳細については、「関連クラス」の API リファレンスをご参照ください。
録画の開始
// 録画を開始します。
recorder.startRecording();クリップの録画
// 録画を開始します。
recorder.startRecording();
// 録画を停止します。ビデオクリップが生成されます。
recorder.stopRecording();
recorder.startRecording();
// 録画をキャンセルします。現在のビデオクリップは保存されません。
recorder.cancelRecording();
// 次のビデオクリップの録画を続行します。
recorder.startRecording();
recorder.stopRecording();録画の終了
録画を終了する際に、すべてのクリップを 1 つのビデオにマージするか、マージせずにクリップの設定ファイルを生成するかを選択できます。コードで使用されるパラメーターの詳細については、「関連クラス」の API リファレンスをご参照ください。
// 録画を終了し、ビデオクリップを 1 つのビデオにマージします。
recorder.finishRecording();
// 録画を終了し、クリップの設定ファイルを生成します (マージなし)。
recorder.finishRecordingForEdit();カメラコントロールとクリップ管理
カメラコントロール (カメラタイプやフラッシュモードなど) とクリップ管理パラメーター (最大/最小録画時間、クリップの削除、クリップ数のクエリなど) を設定します。これらの設定は任意です。コードで使用されるパラメーターの詳細については、「関連クラス」の API リファレンスをご参照ください。
カメラコントロール
// カメラの数を取得します。
AliyunICameraCapture.getCameraCount();
// カメラタイプを設定します:フロントカメラまたはリアカメラ。
AliyunICameraCapture.setCamera(CameraType cameraType);
// センサーの回転角度を設定します。
// 重要:正しい使用法については、API リファレンスをご参照ください。
AliyunICameraCapture.setRotation(int rotation);
// ビデオ録画の回転角度を設定します。
// 重要:正しい使用法については、API リファレンスをご参照ください。
AliyunICameraCapture.setRecordRotation(int rotation);
// カメラのプレビューパラメーター (フラッシュ、フォーカスモード、ズーム、露出) を設定します。
// これらのパラメーターは、以下のメソッドを使用して個別に設定することもできます。
AliyunICameraCapture.setCameraParam(CameraParam cameraParam);
// フロントカメラとリアカメラを切り替えます。
AliyunICameraCapture.switchCamera();
// フラッシュモードを設定します。
AliyunICameraCapture.setLight(FlashType flashType);
// ズームレベルを設定します。
AliyunICameraCapture.setZoom(float rate);
// 露出補正率を設定します。
AliyunICameraCapture.setExposureCompensationRatio(float value);
// フォーカスモードを設定します。
AliyunICameraCapture.setFocusMode(int mode);
// フォーカスポイントを手動で設定します。
AliyunICameraCapture.setFocus(float xRatio, float yRatio);クリップ管理
// クリップマネージャーを取得します。
AliyunIClipManager manager = AliyunIVideoRecorder.getClipManager();
// 最大録画時間を設定します (単一クリップではなく、合計時間)。
manager.setMaxDuration(int maxDurationMs);
// 最小録画時間を設定します (単一クリップではなく、合計時間)。
manager.setMinDuration(int minDurationMs);
// 最後のクリップを削除します。
manager.deletePart();
// 特定のインデックスのクリップを削除します。
manager.deletePart(int index);
// すべてのクリップを削除します。
manager.deleteAllPart();
// すべてのクリップの合計時間を取得します。
manager.getDuration();
// クリップの総数を取得します。
manager.getPartCount();
// クリップファイルパスのリストを取得します。
manager.getVideoPathList();エフェクトの設定
任意で、レタッチ、フィルター、アニメーションスタンプなどの録画エフェクトを設定します。コードで使用されるパラメーターの詳細については、「関連クラス」の API リファレンスをご参照ください。
フィルター
カスタムフィルターを作成できます。フィルターの作成方法の詳細については、「フィルターとトランジション」をご参照ください。
// フィルターを適用します。
AliyunICameraCapture.applyFilter(EffectFilter effectFilter);
// フィルターを削除します。
AliyunICameraCapture.removeFilter();アニメーションフィルター
// アニメーションフィルターを適用します。
AliyunICameraCapture.applyAnimationFilter(EffectFilter effectFilter);
// アニメーションフィルターを削除します。
AliyunICameraCapture.removeAnimationFilter(EffectFilter effctFilter);静的スタンプ
// 静的スタンプを追加します。
AliyunICameraCapture.addImage(EffectImage effctImage);
// 静的スタンプを削除します。
AliyunICameraCapture.removeImage(EffectImage effctImage);
// 静的スタンプの位置を更新します。
AliyunICameraCapture.setEffectView(float xRatio,float yRatio,float widthRatio,float heightRatio,EffectBase effectBase);アニメーションスタンプ
カスタムアニメーションスタンプを作成できます。アニメーションスタンプの作成方法の詳細については、「アニメーション」をご参照ください。
// アニメーションスタンプを追加します。
AliyunICameraCapture.addPaster(EffectPaster effectPaster,float sx,float sy,float sw,float sh,float rotation,boolean flip);
// アニメーションスタンプを削除します。
AliyunICameraCapture.removePaster(EffectPaster effectPaster);
// アニメーションスタンプの位置を更新します。
AliyunICameraCapture.setEffectView(float xRatio,float yRatio,float widthRatio,float heightRatio,EffectBase effectBase);高度なレタッチ
ビデオ録画モジュールは、基本的な組み込みレタッチ機能を提供し、Alibaba Cloud Queen SDK や FaceUnity などのサードパーティ SDK をサポートしています。組み込み機能ではレタッチレベルの調整しかできませんが、サードパーティ SDK はレタッチ、顔シェイピング、メイク、フィルター、スタンプなどの高度な機能を提供します。
組み込みレタッチ
// レタッチを有効または無効にします。 AliyunICameraCapture.setBeautyStatus(boolean on); // レタッチレベルを設定します。 AliyunICameraCapture.setBeautyLevel(int level);レタッチ SDK
サードパーティのレタッチ SDK のエフェクトを使用するには、まず必要な権限を取得し、その SDK をショートビデオ SDK と統合する必要があります。
Alibaba Cloud Queen SDK の統合方法については、「Alibaba Cloud Queen SDK」をご参照ください。エフェクトの設定方法を示すサンプルコードについては、「使用例」をご参照ください。
FaceUnity の購入、統合、使用方法については、「FaceUnity」をご参照ください。
サードパーティのレタッチ SDK は、エフェクトを適用するためにカメラテクスチャ ID と RAW カメラフレームデータを必要とします。以下のコードは、このデータを取得する方法を示しています。
カメラテクスチャ ID データの取得
AliyunICameraCapture.setOnTextureIdCallback(new OnTextureIdCallBack() { @Override public int onTextureIdBack(int textureId, int textureWidth, int textureHeight, float[] matrix) { if (mBeautyInterface != null) { return mBeautyInterface.onTextureIdBack(textureId, textureWidth, textureHeight, matrix, mControlView.getCameraType().getType()); } return textureId; } @Override public int onScaledIdBack(int scaledId, int textureWidth, int textureHeight, float[] matrix) { return scaledId; } @Override public void onTextureDestroyed() { // カスタムレンダリング (サードパーティレンダリング) の GL リソースを破棄するには: // SDK バージョン 3.7.8 より前では、GLSurfaceView.queueEvent を使用できます。 // SDK バージョン 3.7.8 以降では、このコールバックで GL リソースを破棄します。 if (mBeautyInterface != null) { mBeautyInterface.release(); mBeautyInterface = null; } } });RAW カメラフレームデータの取得
AliyunICameraCapture.setOnFrameCallback(new OnFrameCallback() { @Override public void onFrameBack(byte[] bytes, int width, int height, Camera.CameraInfo info) { // このコールバックは RAW NV21 データを提供します。このデータは主に FaceUnity を使用した高度なレタッチに使用されます。 if (mBeautyInterface != null) { mBeautyInterface.onFrameBack(bytes, width, height, info); } } @Override public Camera.Size onChoosePreviewSize(List<Camera.Size> supportedPreviewSizes, Camera.Size preferredPreviewSizeForVideo) { return null; } @Override public void openFailed() { } });
その他の機能
BGM、ウォーターマーク、可変速再生などの機能を追加できます。コードで使用されるパラメーターの詳細については、「関連クラス」の API リファレンスをご参照ください。
可変速再生
// 録画速度を設定します。
AliyunIVideoRecorder.setRate(float rate);ミュート
// マイクをミュートします。
AliyunIVideoRecorder.setMute(boolean isMute);自動クリア
// 録画インターフェイスを終了する際に、録画されたビデオクリップを自動的にクリアするかどうかを制御します。
AliyunIVideoRecorder.setIsAutoClearClipVideos(boolean isAutoClear);BGM
// BGM を設定します。
AliyunIVideoRecorder.setMusic(String path,long startTime,long duration);
// BGM を削除します。
AliyunIVideoRecorder.removeMusic();ウォーターマーク
// ウォーターマークを追加します。
AliyunIVideoRecorder.addWaterMark(EffectImage effectImage);
// ウォーターマークを削除します。
AliyunIVideoRecorder.removeWaterMark(EffectImage effectImage);背景の設定
// 背景色を設定します。
AliyunIVideoRecorder.setBackgroundColor(int color);
// ビットマップから背景画像を設定します。
AliyunIVideoRecorder.setBackgroundImage(Bitmap bitmap);
// ファイルパスから背景画像を設定します。
AliyunIVideoRecorder.setBackgroundImage(String path);
// 背景をクリアします。
AliyunIVideoRecorder.clearBackground();サンプルコード
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceView;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.aliyun.svideosdk.common.struct.common.AliyunLayoutParam;
import com.aliyun.svideosdk.common.struct.common.VideoDisplayMode;
import com.aliyun.svideosdk.common.struct.encoder.VideoCodecs;
import com.aliyun.svideosdk.common.struct.recorder.CameraType;
import com.aliyun.svideosdk.multirecorder.AliyunICameraCapture;
import com.aliyun.svideosdk.multirecorder.AliyunIVideoRecorder;
import com.aliyun.svideosdk.multirecorder.AliyunIViewCapture;
import com.aliyun.svideosdk.multirecorder.OnVideoRecordListener;
import com.aliyun.svideosdk.multirecorder.config.AliyunVideoRecorderConfig;
import com.aliyun.svideosdk.multirecorder.impl.AliyunMultiRecorderCreator;
import java.io.File;
/**
* マルチソース録画のデモです。
* 注:開始する前に、ストレージ、カメラ、マイクの権限を付与する必要があります。
*/
public class MultiRecorderDemo extends AppCompatActivity {
private AliyunIVideoRecorder mRecorder;
private TextView mBtnRecord;
private SurfaceView mCameraPreview;
private View mViewRecord;
private View mViewRecordIcon;
private boolean mIsRecording = false;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.multi_recoder_demo_layout);
initViews();
initRecorder();
}
@Override
protected void onResume() {
super.onResume();
mRecorder.startPreview();
}
@Override
protected void onPause() {
super.onPause();
stopRecording();
mRecorder.stopPreview();
}
@Override
protected void onDestroy() {
super.onDestroy();
mRecorder.destroy();
}
private String getSaveDir() {
String saveDir = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "MultiRecord";
File dirFile = new File(saveDir);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
return saveDir;
}
private void initViews() {
mBtnRecord = findViewById(R.id.record_btn);
mCameraPreview = findViewById(R.id.multi_record_camera);
mViewRecord = findViewById(R.id.multi_record_view);
mViewRecordIcon = mViewRecord.findViewById(R.id.record_view_icon);
}
private void initRecorder() {
// 1. パラメーターを設定します。
AliyunVideoRecorderConfig config = AliyunVideoRecorderConfig.builder()
// 必須パラメーター
.videoWidth(1080)
.videoHeight(1920)
.outputPath(getSaveDir() + File.separator + System.currentTimeMillis() + ".mp4")
// 任意パラメーター
.videoCodecs(VideoCodecs.H264_HARDWARE) // ハードウェアエンコーディングを使用します。
.build();
// 2. 録画インスタンスを作成します。
mRecorder = AliyunMultiRecorderCreator.getVideoRecorderInstance(this, config);
// 3. ビデオソースを設定します。
// 3.1 カメラ録画を設定します。
addCameraCapture();
// 3.2 ビュー録画を設定します。
addViewCapture();
// 3.3 ビデオソースを準備します。
mRecorder.prepare();
// 4. コールバックを設定します。
mRecorder.setOnRecordListener(new OnVideoRecordListener() {
@Override
public void onProgress(long duration) {
}
@Override
public void onFinish(String outputPath) {
}
@Override
public void onClipComplete(boolean validClip, long clipDuration) {
}
@Override
public void onMaxDuration() {
runOnUiThread(new Runnable() {
@Override
public void run() {
stopRecording();
}
});
}
@Override
public void onError(int errorCode) {
runOnUiThread(new Runnable() {
@Override
public void run() {
stopRecording();
}
});
}
@Override
public void onInitReady() {
}
});
}
private void addCameraCapture() {
// 1. 左側のレイアウトを設定します。
AliyunLayoutParam cameraLayoutParam = AliyunLayoutParam.builder()
.layoutLevel(1)
.centerX(0.25f)
.centerY(0.5f)
.widthRatio(0.5f)
.heightRatio(1.0f)
.displayMode(VideoDisplayMode.FILL)
.build();
// 2. ビデオソースを追加します。
AliyunICameraCapture cameraCapture = mRecorder.getVideoCapture().addCameraCapture(cameraLayoutParam);
// 3. ビデオソースを設定します。
// カメラのプレビュービューを設定します。これは必須のプロパティです。
cameraCapture.setDisplayView(mCameraPreview);
// 任意の設定
cameraCapture.setCamera(CameraType.BACK);// リアカメラを使用します。
}
private void addViewCapture() {
// 1. 右側のレイアウトを設定します。
AliyunLayoutParam viewLayoutParam = AliyunLayoutParam.builder()
.layoutLevel(2)
.centerX(0.75f)
.centerY(0.5f)
.widthRatio(0.5f)
.heightRatio(1.0f)
.displayMode(VideoDisplayMode.FILL)
.build();
// 2. ビデオソースを追加します。
// 現在の録画ビューを取得します。
View recordView = mViewRecord;
AliyunIViewCapture viewCapture = mRecorder.getVideoCapture().addViewCapture(viewLayoutParam, recordView);
// 3. ビデオソースを設定します (任意)。
}
private void startRecording() {
if (mIsRecording) {
return;
}
mIsRecording = true;
mRecorder.startRecording();
}
private void stopRecording() {
if (!mIsRecording) {
return;
}
mRecorder.stopRecording();
mIsRecording = false;
}
public void onClickRecord(View view) {
if (mIsRecording) {
stopRecording();
mBtnRecord.setText("録画開始");
} else {
startRecording();
mBtnRecord.setText("録画停止");
}
}
}XML 設定のサンプル
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/demo_root_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<SurfaceView
android:id="@+id/multi_record_camera"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/multi_record_view"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:id="@+id/record_view_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="ビュー録画" />
</FrameLayout>
</LinearLayout>
<Button
android:id="@+id/record_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginLeft="5dp"
android:layout_marginBottom="5dp"
android:onClick="onClickRecord"
android:text="録画開始" />
</RelativeLayout>