ショートビデオSDKは、基本的な録画に基づいてアップグレードされた録画機能を提供します。 基本的な録画のすべての機能とは別に、短いビデオSDKは、画面録画とも呼ばれるビュー録画もサポートしています。 ビューに記録されたビデオやカメラを使用して記録されたビデオなど、複数のソースから収集されたビデオを組み合わせることができます。
サポートされているエディション
| エディション | 対応 |
|---|---|
| Professional | 必須 |
| 標準モード | 必須 |
| 基本 | 任意 |
用語
このセクションでは、マルチソース録音の理解に役立つ用語について説明します。 詳細については、「マルチソース录音」、「トラック」、および「トラックのレイアウト」をご参照ください。
関連クラス
| 分類 | 説明 |
|---|---|
| AliyunIDoRecorder | 記録、プレビュー設定、エフェクト設定、コールバック設定など、マルチソース記録機能を定義するコアクラス。 |
| AliyunMultiRecorderCreator | マルチソース録音インスタンスを作成するために使用されるファクトリクラス。 |
| AliyunVideoRecorderConfig | ビデオの幅と高さ、エンコーダの種類、フレームレートなど、記録パラメータを定義するクラス。 |
| AliyunIDoCapture | カメラデータコレクターと部分的な画面録画コレクターの追加を含む、ビデオキャプチャ設定を定義するクラス。 |
| AliyunICameraCapture | カメラの記録を定義するクラス。 |
| AliyunIViewCapture | 画面記録を定義するクラス。 |
| OnVideoRecordListener | 録音完了コールバック、録音進行状況コールバック、録音エラーコールバックなど、録音リスナーを定義するクラス。 |
| OnAudioCallBack | PCM形式のオーディオデータのコールバックを定義するクラス。 |
| OnFrameCallBack | 選択したプレビュー解像度のコールバック、カメラでキャプチャされたフレームデータのコールバック、カメラの有効化に失敗したときに発生するエラーのコールバックなど、データキャプチャのコールバックを定義するクラス。 |
| OnPictureCallback | 写真のキャプチャとスナップショットのコールバックを定義するクラス。 |
| AliyunIClipManager | ビデオクリップを管理するクラスは、たとえば、ビデオクリップを削除したり、録画時間を設定したりします。 |
マルチソース記録の設定
| 設定 | 手順 | 説明 | サンプルコード |
|---|---|---|---|
| 基本設定 | 1 | 録画インスタンスを作成および破棄し、録画パラメータを設定します。 | AliyunIDoRecorderクラスの初期化とパラメーターの設定 |
| 2 | 画面録画とカメラ録画のパラメーターを設定します。 | ビデオソースの設定 | |
| 3 | コールバックを設定します。 | コールバックの設定 | |
| 4 | プレビュービューを設定し、プレビューを有効にします。 | プレビューの有効化 | |
| 5 | ビデオクリップの録画を開始、キャンセル、および停止します。 | 録音を開始 | |
| 6 | 記録を停止し、設定情報を生成します。 | 録音を停止する | |
| 詳細構成 | 7 | カメラ制御とビデオクリップ管理のパラメーターを設定します。 カメラ制御のパラメータには、カメラタイプとフラッシュモードがあります。 ビデオクリップ管理のパラメータには、最大または最小の録画時間、ビデオクリップを削除する方法、ビデオクリップの数を照会する方法などがあります。 ビジネス要件に基づいてこれらのパラメーターを設定します。 | カメラの設定とビデオクリップの管理 |
| 8 | ビジネス要件に基づいて、レタッチ、フィルター、アニメーションステッカーなどの録音エフェクトを設定します。 | エフェクトの設定 | |
| 9 | BGM、バックグラウンドイメージ、およびスピードランピングを設定します。 | その他の機能の設定 |
AliyunIDoRecorderクラスの初期化とパラメーターの設定
AliyunIDoRecorderクラスを初期化し、録画インスタンスを作成し、録画パラメーターを設定します。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
// 録音インスタンスを作成します。
AliyunIVideoRecorder recorder = AliyunMultiRecorderCreator.getVideoRecorderInstance (コンテキスト、設定);
// 録音インスタンスを破棄します。
// SDKを使用する必要がなくなった場合、またはプログラムを終了する前に、録画インスタンスを破棄します。 使用中に録画インスタンスを破棄しないでください。 アクティビティ# onDestroyで関連するAPI操作を呼び出します。
recorder.de stroy();AliyunVideoRecorderConfig config = AliyunVideoRecorderConfig.builder()
// 必須パラメーター:
. videoWidth(***)
. videoHeight(***)
. outputPath(***)
// オプションのパラメーター:
.***()
.***()
.build();ビデオソースの設定
ビジネス要件に基づいて複数のソースからのビデオを組み合わせます。 すべてのビデオソースを追加したら、recorder.prepare() を呼び出して、ビデオソースが追加されたことを示す必要があります。
カメラ録画の設定
// 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 ***();画面録画の設定
// 1. レイアウトを設定します。
AliyunLayoutParam viewLayoutParam = AliyunLayoutParam.builder()
. layoutLevel(***)
. centerX(***)
. centerY(***)
. widthRatio(***)
. heightRatio(***)
. displayMode(***)
. build();
// 2。 ビデオソースを追加します。
// 現在の録画ビューを取得します。
ビューrecordView = getRecordView();
AliyunIViewCapture viewCapture = recorder.getVideoCapture().addViewCapture(viewLayoutParam、recordView);
// 3。 (オプション) ビデオソースを設定します。
viewCapture.set ***();ビデオソースの準備
recorder.prepare();コールバックの設定
コールバックを設定して、オーディオとビデオの処理の進行状況とステータスをタイムリーに取得できます。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
// (オプション) 録音コールバックを設定します。
recorder.setOnRecordListener(OnVideoRecordListener);
// (オプション) オーディオコレクションのコールバックを設定します。
recorder.setOnAudioCallback(OnAudioCallBack);プレビューの有効化
ほとんどの場合、Activity#onResumeでstartPreviewを呼び出し、Activity#onPauseでstopPreviewを呼び出します。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
// プレビューを開始します。
// Activity#onResumeで次のAPI操作を呼び出します。
AliyunIRecorder.startPreview();
// プレビューを停止します。
// Activity#onPauseで次のAPI操作を呼び出します。
AliyunIRecorder.stopPreview();録音を開始
録画プロセスでは、必要な完全なビデオを取得するまで、ビデオを停止、キャンセル、または再録画する必要があります。 録画を停止すると、ビデオクリップが生成されます。 ただし、録画をキャンセルした場合、現在のビデオクリップは保持されません。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
// 録音を開始します。
recorder.startRecording();// 録音を開始します。
recorder.startRecording();
// 録音を停止します。 ビデオクリップが生成される。
recorder.stopRecording();
recorder.startRecording();
// 録音をキャンセルします。 現在のビデオクリップは保存されません。
recorder.ca ncelRecording();
// 次のビデオクリップの録画を続行します。
recorder.startRecording();
recorder.stopRecording();録音を停止する
録画を停止すると、録画されたビデオクリップがビデオにマージされるか、録画されたビデオクリップに関する設定情報が生成されます。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
// 録画を停止し、録画したビデオクリップを1つのビデオにマージします。
recorder.finishRecording();
// ビデオクリップをマージせずに、録画を停止し、録画したビデオクリップに関する設定情報を生成します。
recorder.finishRecordingForEdit();カメラの設定とビデオクリップの管理
カメラ制御とビデオクリップ管理のパラメーターを設定します。 カメラ制御のパラメータには、カメラタイプとフラッシュモードがあります。 ビデオクリップ管理のパラメータには、最大または最小の録画時間、ビデオクリップを削除する方法、ビデオクリップの数を照会する方法などがあります。 ビジネス要件に基づいてこれらのパラメーターを設定します。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
// カメラの数を取得します。
AliyunICameraCapture.getCameraCount();
// カメラタイプ: フロントカメラまたはリアカメラを指定します。
AliyunICameraCapture.setCamera(CameraType cameraType);
// センサーの角度を指定します。
// この設定は非常に重要です。 SDKリファレンスを読むことを推奨します。
AliyunICameraCapture.setRotation(int rotation);
// ビデオが記録される角度を指定します。
// この設定は非常に重要です。 SDKリファレンスを読むことを推奨します。
AliyunICameraCapture.setRecordRotation(int rotation);
// プレビュー時に、フラッシュモード、フォーカスモード、ズーム倍率、露出レベルなどのカメラパラメータを設定します。 次の方法を使用して、プレビューパラメーターを個別に設定することもできます。
AliyunICameraCapture.setCameraParam(CameraParam cameraParam);
// フロントカメラとリアカメラを切り替えます。
AliyunICameraCapture.switchCamera();
// フラッシュモードを指定します。
AliyunICameraCapture.setLight(FlashType flashType);
// ズーム倍率を指定します。
AliyunICameraCapture.setZoom (フロートレート);
// 露出レベルを指定します。
AliyunICameraCapture.setExposureCompensationRatio (フロート値);
// フォーカスモードを指定します。
AliyunICameraCapture.setFocusMode(intモード);
// 手動フォーカスを設定します。
AliyunICameraCapture.setFocus(float xRatio, float yRatio);// クリップマネージャを取得します。
AliyunIClipManagerマネージャー=AliyunIVideoRecorder.getClipManager();
// 最大録画時間を指定します。これは、単一のビデオクリップではなく、すべてのビデオクリップの最大時間です。
manager.setMaxDuration(int maxDurationMs);
// 最小録画時間を指定します。これは、単一のビデオクリップではなく、すべてのビデオクリップの最小時間です。
manager.setMinDuration(int minDurationMs);
// 最後のビデオクリップを削除します。
manager.de letePart();
// 指定したビデオクリップを削除します。
manager.de letePart(int index);
// すべてのビデオクリップを削除します。
manager.de leteAllPart();
// ビデオクリップの合計期間を取得します。
manager.getDuration();
// ビデオクリップの総数を取得します。
manager.getPartCount();
// ビデオクリップのパスを取得します。
manager.getVideoPathList();エフェクトの設定
ビジネス要件に基づいて、レタッチ、フィルター、アニメーションステッカーなどの録音エフェクトを設定します。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
フィルター
カスタムフィルターを作成できます。 詳細については、「フィルターとトランジション」をご参照ください。
// フィルターを適用します。
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);高度なレタッチ
- 内蔵レタッチ
// レタッチを有効または無効にします。 AliyunICameraCapture.setBeautyStatus (ブール値); // レタッチレベルを設定します。 AliyunICameraCapture.setBeautyLevel(intレベル); - SDKのレタッチ
カメラテクスチャIDとカメラ生フレームデータは、レタッチ効果を実装するためにSDKをレタッチするために必要です。 次のコードは、カメラテクスチャIDとカメラ生フレームデータを取得する方法の例を示しています。
- カメラテクスチャIDの取得
AliyunICameraCapture.setOnTextureIdCallback(new OnTextureIdCallBack() { @Override public int onTextureIdBack(int textureId, int textureWidth, int textureHeight, float[] matrix) { if (mBeautyInterface != null) { リターンmBeautyInterface.onTextureIdBack(textureId、textureWidth、textureHeight、matrix、mControlView.getCameraType().getType()); } textureIdを返します。 } @Override public int onScaledIdBack(int scaledId, int textureWidth, int textureHeight, float[] matrix) { scaledIdを返します。 } @Override public void onTextureDestroyed() { // V3.7.8より前のバージョンのショートビデオSDKの場合、GLSurfaceViewでGLSurfaceView.queueEventを使用して、サードパーティのカスタムレンダリング用にglリソースを破棄できます。 ショートビデオSDK V3.7.8以降の場合は、このコールバックでglリソースを破棄することを推奨します。 if (mBeautyInterface != null) { mBeautyInterface.release(); mBeautyInterface = null; } } }); - カメラの生フレームデータを取得する
AliyunICameraCapture.setOnFrameCallback(new OnFrameCallBack() { @Override public void onFrameBack(byte[] bytes, int width, int height, Camera.CameraInfo info) { // コールバック生データのデータ型はNV21です。 取得した生データはFaceUnityで使用されます。 if (mBeautyInterface != null) { mBeautyInterface.onFrameBack (バイト、幅、高さ、情報); } } @Override public Camera.Size onChoosePreviewSize (リスト <Camera.Size> supportedPreviewSizes、 カメラサイズpreferredPreviewSizeForVideo) { ヌルを返します。 } @Override public void openFailed() { } });
- カメラテクスチャIDの取得
その他の機能の設定
バックグラウンドミュージック、ウォーターマーク、スピードランピングなどの機能がサポートされています。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
// 録画の速度ランピングを設定します。
AliyunIDoRecorder. setRate (フロートレート);// マイクをミュートします。
AliyunIDoRecorder. setMute (ブールisMute);// 録画終了時に録画したビデオクリップを自動的に消去するかどうかを指定します。
AliyunIDoRecorder. setIsAutoClearClipVideos (ブールisAutoClear);// バックグラウンドミュージックを設定します。
AliyunIVideoRecorder.setMusic(String path,long startTime,long duration);
// バックグラウンドミュージックを削除します。
AliyunIDoRecorder. removeMusic();// 透かしを追加します。
AliyunIDoRecorder. addWaterMark(EffectImage effectImage);
// 透かしを削除します。
AliyunIDoRecorder. removeWaterMark(EffectImage effectImage);// 背景色を指定します。
AliyunIDoRecorder. setBackgroundColor(int color);
// ビットマップの背景画像を指定します。
AliyunIDoRecorder. setBackgroundImage (ビットマップ);
// 背景画像のパスを指定します。
AliyunIDoRecorder. setBackgroundImage (文字列パス);
// 背景をクリアします。
AliyunIDoRecorder. clearBackground();マルチソース記録のサンプルコード
android.os. バンドルをインポートします。android.os.Environmentをインポートします。android.view.SurfaceViewをインポートします。android.view.Viewをインポートします。android.widget.TextViewをインポートします。androidx.annotation.Nullableをインポートします。androidx.appcompat.app.AppCompatActivityをインポートします。impor t com.aliyun.svideosdk.common.struct.com mon.AliyunLayoutParam;
impor t com.aliyun.svideosdk.common.struct.com mon.VideoDisplayMode;
impor t com.aliyun.svideosdk.com mon.struct.encoder.VideoCodecs;
impor t com.aliyun.svideosdk.com mon.struct.recorder.CameraType;
com.aliyun.svideosdk.multirecorder.AliyunICameraCaptureをインポートします。com.aliyun.svideosdk.multirecorder.AliyunIVideoRecorderをインポートします。com.aliyun.svideosdk.multirecorder.AliyunIViewCaptureをインポートします。com.aliyun.svideosdk.multirecorder.OnVideoRecordListenerをインポートします。com.aliyun.svideosdk.multirecorder.config.AliyunVideoRecorderConfigをインポートします。com.aliyun.svideosdk.multirecorder.impl.AliyunMultiRecorderCreatorをインポートします。java.io. ファイルをインポートします。/**
* マルチソース録音のデモサンプルコード
* 注: 事前にストレージ、カメラ、マイクの権限を取得する必要があります。
* /
public class MultiRecorderDemoがAppCompatActivityを拡張 {
プライベートAliyunIVideoRecorder mRecorder;
プライベートTextView mBtnRecord;
プライベートSurfaceView mCameraPreview;
プライベートビューmViewRecord;
プライベートビューmViewRecordIcon;
プライベートブールmIsRecording = false;
@Override
protected void onCreate(@ Nullableバンドル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.de stroy();
}
プライベート文字列getSaveDir() {
String saveDir = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "MultiRecord";
ファイルdirFile=新しいファイル (saveDir);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
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 (長期間) {
}
@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. ビデオソースを追加します。
// 現在の録画ビューを取得します。
ビュー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 (ビューを表示) {
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"
アンドロイド: layout_width="match_parent"
アンドロイド: layout_height="match_parent">
<LinearLayout
アンドロイド: layout_width="match_parent"
アンドロイド: layout_height="match_parent"
アンドロイド: orientation="horizontal">
<SurfaceView
android:id="@ + id/multi_record_camera"
android:layout_width="0dp"
アンドロイド: layout_height="match_parent"
アンドロイド: layout_weight="1" />
<FrameLayout
android:id="@ + id/multi_record_view"
android:layout_width="0dp"
アンドロイド: layout_height="match_parent"
アンドロイド: layout_weight="1">
<TextView
android:id="@ + id/record_view_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
アンドロイド: 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"
アンドロイド: layout_marginLeft="5dp"
アンドロイド: layout_marginBottom="5dp"
android:onClick="onClickRecord"
android:text="録音開始" />
</RelativeLayout>