ショートビデオSDKは基本的な録画機能を提供し、バックグラウンドミュージック、スピードランピング、フェイスステッカーなどの録画エフェクトをショートビデオに適用できます。
サポートされているエディション
エディション | 対応 |
Professional | 必須 |
標準モード | 必須 |
基本 | 必須 |
関連クラス
分類 | 説明 |
録画、プレビュー設定、エフェクト設定、コールバック設定など、録画機能を定義するコアクラス。 | |
ビデオクリップを管理するクラスは、例えば、クリップ情報を取得したり、ビデオクリップを削除したりする。 | |
プロキシコールバックの記録を定義するクラス。 |
記録の設定
ビデオを録画するには、カメラとマイクの権限が必要です。
次の図は、基本的な録音のプロセスを示しています。

設定 | 手順 | 説明 | サンプルコード |
基本設定 | 1 | AliyunIRecorderクラスを初期化し、録画インスタンスを作成し、録画パラメーターを設定します。 | |
2 | プレビューを開始および停止します。 | ||
3 | ビデオクリップの録画を開始、キャンセル、および停止します。 | ||
4 | 記録を停止し、設定情報を生成します。 | ||
詳細構成 | 5 | 最大録画時間または最小録画時間、ビデオクリップの削除方法、ビデオクリップの数の照会方法などのパラメーターを設定します。 ビジネス要件に基づいてこれらのパラメーターを設定します。 | |
6 | ビジネス要件に基づいて、レタッチ、フィルター、BGMなどの録音エフェクトを設定します。 | ||
7 | 一般的なコールバックと、画面ロック、着信、バックグラウンドへの切り替えなどの特別なイベントの処理方法を設定します。 |
クラスを初期化するInitialize the class
AliyunIRecorderクラスを初期化し、録画インスタンスを作成し、録画パラメーターを設定します。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
taskPathは、記録関連の設定が格納されているフォルダのパスを指定します。
プレビューのアスペクト比は、videoSizeの値と同じである必要があります。
CGSize解像度=CGSizeMake(720、1280); // 720P
AliyunIRecorder * recorder = [[AliyunIRecorder alloc] initWithDelegate:self videoSize: 解像度];
recorder.taskPath = taskPath;// フォルダのパスを指定します。
recorder.preview = self.videoView;// // プレビュービューを設定します。
recorder.recordFps = 30;
recorder.GOP = recorder.recordFps * 3; // キーフレーム間隔を3秒に設定します。
recorder.outputPath = [taskPath stringByAppendingPathComponent:@ "output.mp4"];// 録画したビデオの出力パスを指定します。
recorder.frontCaptureSessionPreset = AVCaptureSessionPreset1280x720;
recorder.backCaptureSessionPreset = AVCaptureSessionPreset1280x720;
// ビデオクリップを設定します。
recorder.clipManager.de leteVideoClipsOnExit = YES; // アプリケーションを終了すると、すべてのビデオクリップが自動的に削除されます。 または、記録が完了した後にtaskPathを削除することもできます。
recorder.clipManager.maxDuration = 15;
recorder.clipManager.minDuration = 3;
self.aliyunRecorder=レコーダー;プレビューの設定
コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
プレビューの有効化
// AliyunIRcorderCameraPositionFrontを呼び出して、フロントカメラのプレビューを有効にします。
// AliyunIRcorderCameraPositionBackを呼び出して、リアカメラのプレビューを有効にします。
[self.aliyunRecorder startPreviewWithPositon: AliyunIRcorderCameraPositionFront];プレビューパラメーターの設定
プレビューを有効にすると、ビジネス要件に基づいてプレビューパラメーターを設定できます。
// 懐中電灯をオンにします。 リアカメラを使用すると、懐中電灯をオンにできます。
AliyunIRcorderTorchMode torchMode = self.aliyunRecorder.ca meraPosition ==AliyunIRcorderCameraPositionBack? AliyunIRcorderTorchModeOn: AliyunIRcorderTorchModeOff;
[self.aliyunRecorder switchTorchWithMode:torchMode];
// フロントカメラとリアカメラを切り替えます。
[self.aliyunRecorder switchCameraPosition];
// ズーム倍率を指定します。
self.aliyunRecorder.videoZoomFactor = 30.0;
// カメラアングルを指定します。
self.aliyunRecorder.ca meraRotate = 270;
// ビデオの解像度を指定します。
[self.aliyunRecorder reStartPreviewWithVideoSize:CGSizeMake(720、720)];プレビューの停止
// 録画が完了したら、stopPreviewを呼び出してプレビューを停止します。
[self.aliyunRecorder stopPreview];録音を開始
startRecordingとstopRecordingはペアで呼び出す必要があります。 それらを1回または複数回呼び出すことができ、1つ以上の一時的なビデオクリップが生成されます。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
// ビデオクリップの録画を開始します。
[self.aliyunRecorder startRecording];
// ビデオクリップの録画を停止します。
[self.aliyunRecorder stopRecording];Stop recording
If you stop recording, the recorded video clips are merged into a video or the configuration information about the recorded video clips is generated. コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
finishRecording: 録画したビデオクリップを1つのビデオにマージします。 生成されたビデオの編集を続行する必要がない場合は、このAPIを呼び出します。
finishRecordingForEdit: 録画したビデオクリップをマージしません。 生成されたビデオの編集を後で続行する場合は、このAPIを呼び出します。 taskPathパラメーターを設定して、エディターを初期化できます。 詳細については、「エディターの初期化」をご参照ください。
// 録画を停止し、録画したビデオクリップを1つのビデオにマージします。
[self.aliyunRecorder finishRecording];
// 録画したビデオクリップを1つのビデオにマージせずに録画を停止します。 taskPathが生成されます。
NSString * taskPath = [self.aliyunRecorder finishRecordingForEdit];
AliyunEditor * editor = [[AliyunEditor alloc] initWithPath:taskPathプレビュー: プレビュー];
...ビデオクリップの管理
最大録画時間または最小録画時間、ビデオクリップの削除方法、ビデオクリップの数の照会方法などのパラメーターを設定します。 ビジネス要件に基づいてこれらのパラメーターを設定します。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
// 最後のビデオクリップを削除します。
[self.aliyunRecorder.clipManager deletePart];
// すべてのビデオクリップを削除します。
[self.aliyunRecorder.clipManager deleteALLPart];
// ビデオクリップの総数を取得します。
[self.aliyunRecorder.clipManager partCount];エフェクトの設定
ビジネス要件に基づいて、レタッチ、フィルター、BGMなどの録音エフェクトを設定します。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
フィルター
カスタムフィルターを作成できます。 詳細については、「フィルターとトランジション」をご参照ください。
// フィルターを追加します。
NSString * filterDir = [self.class resourcePath:@ "Filter/Jiaopian"];
AliyunEffectFilter * filter = [[AliyunEffectFilter alloc] initWithFile:filterDir];
[self.aliyunRecorder applyFilter: フィルター];
// フィルターを削除します。
[self.aliyunRecorder deleteFilter];アニメーションフィルター
// アニメーションフィルターを追加します。
NSString * filterDir = [self.class resourcePath:@ "AnimationEffect/split_screen_3"];
AliyunEffectFilter * animationFilter =[[AliyunEffectFilter alloc] initWithFile:filterDir];
[self.aliyunRecorder applyAnimationFilter:animationFilter];
// アニメーションフィルターを削除します。
[self.aliyunRecorder deleteAnimationFilter];フェイスステッカー
Built-in facial recognition
// Use the built-in facial recognition feature to add face stickers.
self.aliyunRecorder.us eFaceDetect = YES;// 顔認識を有効にします。 顔は自動的に追跡できます。
self.aliyunRecorder.faceDetectCount = 3;// Specify the number of faces that can be recognized. 最大値: 3。 最小値:1 顔認識が必要ない場合は、useFaceDetectパラメータをNOに設定します。
self.aliyunRecorder.faceDectectSync = YES;// 顔のステッカーがリアルタイムで顔に収まるようにします。 フェイスステッカーは動く顔によく合うことができます。 ただし、パフォーマンスの低いデバイスでは吃音が発生する場合があります。 この機能を有効にしないと、動画の滑らかさは確保できますが、顔のステッカーは動いている顔にうまく収まりません。
NSString * parsterDir = [self.class resourcePath:@ "Gif/hanfumei-800"];
AliyunEffectPaster * paster = [[AliyunEffectPaster alloc] initWithFile:parsterDir];
[self.aliyunRecorder applyPaster:paster];// 顔のステッカーを追加します。
// 顔のステッカーを削除します。
[self.aliyunRecorder deletePaster:paster];カスタム顔認識
// 組み込みの顔認識機能を無効にします。
self.aliyunRecorder.us eFaceDetect = NO;
// コールバックでサードパーティの顔認識ライブラリを呼び出して、顔を認識します。 結果が返されます。
- (void)recorderOutputVideoRawSampleBuffer :( CMSampleBufferRef)sampleBuffer {
NSArray<AliyunFacePoint *> * facePoints = ...; // サードパーティの顔認識ライブラリを使用して顔を認識します。
if (self.aliyunRecorder.faceNumbersCallback) {
int num = (int)facePoints.count;
self.aliyunRecorder.faceNumbersCallback(num);
}
[self.aliyunRecorder faceTrack:facePoints];
}透かし加工
透かしの設定は、画像の追加とレンダリングを意味します。 applyImage操作を呼び出して、静的ステッカーを追加およびレンダリングできます。 たとえば、写真を撮り、写真にフレームを添付できます。
// Add a watermark.
NSString * watermarkPath = [self.class resourcePath:@ "Image/watermark.png"];
AliyunEffectImage * watermark = [[AliyunEffectImage alloc] initWithFile:watermarkPath];
CGSizeサイズ=CGSizeMake(280、200);
CGFloat centerx = 44 + サイズ幅 /2.0;
CGFloat centery = 44 + size.height / 2.0;
watermark.frame = CGRectMake(centerx, centery, size.width, size.height); // フレームの原点は中心点を示すことに注意してください。
[self.aliyunRecorder applyImage: ウォーターマーク];
// 透かしを削除します。
[self.aliyunRecorder deleteImage: ウォーターマーク];音楽
音楽を追加した後は、ビデオをミュートしたりオーディオを録音したりできません。
// 音楽を追加します。
AliyunEffectMusic * effectMusic =[[AliyunEffectMusic alloc] initWithFile:[self.class resourcePath:@ "bgm.aac"]];
effectMusic.startTime = 3.0; // 音楽は3秒の位置から再生されます。
effectMusic.duration = 5.0; // 音楽は5秒間再生されます。 このパラメーターを設定しない場合、音楽は残りの360秒間再生されます。
[self.aliyunRecorder applyMusic:effectMusic];
// 音楽を削除します。
[self.aliyunRecorder applyMusic:nil];高度なレタッチ
ビデオ録画モジュールは、基本的な組み込みレタッチ機能を提供するだけでなく、Alibaba Cloud Queen SDKやFaceUnityなどのレタッチSDKの使用もサポートします。 組み込みのレタッチ機能を使用して、レタッチレベルのみを設定できます。 レタッチSDKは、顔のレタッチ、顔の整形、メイクアップ、フィルター、ステッカーなど、豊富なレタッチ効果を提供します。
内蔵レタッチ
// 組み込みレタッチを有効にします。 self.aliyunRecorder.beautifyStatus = YES; self.aliyunRecorder.beautifyValue = 80; // 組み込みレタッチを無効にします。 self.aliyunRecorder.beautifyStatus = NO; self.aliyunRecorder.beautifyValue = 0;SDKのレタッチ
レタッチSDKが提供するエフェクトをショートビデオSDKで使用するには、最初にレタッチSDKの権限を取得し、レタッチSDKをショートビデオSDKに統合する必要があります。
ショートビデオSDKは、AliyunIRcorderDelegateを使用して、カメラによって収集されたCMSampleBufferRefデータをビジネス層に渡します。 ビジネス層にインポートされたレタッチSDKは、データのカスタムレンダリングを実行し、レンダリング結果CVPixelBufferRefをプレビューおよびプロダクション用のショートビデオSDKに返します。 レタッチSDKはショートビデオSDKのGL環境と競合することに注意してください。
// AliyunIRecorderDelegate - (CVPixelBufferRef)customRenderedPixelBufferWithRawSampleBuffer :( CMSampleBufferRef)sampleBuffer { if (!self.enableBeauty) { return CMSampleBufferGetImageBuffer(sampleBuffer); // カスタムレンダリングを実行しない場合、これが返されます。 } // クイーンSDK を統合してカスタムレンダリングを実行すると、サンプルCVPixelBufferRefが返されます。 ... }
写真のキャプチャ
// 写真を撮り、非同期で次の種類の画像を取得します。
// image: 収集されるレンダリングされたイメージ。
// rawImage: 収集される生のイメージ。
[self.aliyunRecorder takePhoto:^(UIImage * image, UIImage * rawImage) {
}];イベントの処理
一般的なコールバックと、画面ロック、着信、バックグラウンドへの切り替えなどの特別なイベントの処理方法を設定します。 コードで使用されるパラメーターの詳細については、「関連クラス」をご参照ください。
コールバック
// 共通コールバックを次のように設定します。- (void)recorderDeviceAuthorization :( AliyunIRcorderDeviceAuthor) status {
dispatch_async(dispatch_get_main_queue()), ^ {
if (status ==AliyunIRcorderDeviceAuthorAudioDenied) {
[DeviceAuthorization openSetting:@ "マイクを使用する権限がありません。"];
} else if (status ==AliyunIRcorderDeviceAuthorVideoDenied) {
[DeviceAuthorization openSetting:@ "カメラを使用する権限がありません。"];
}
});
}
- (void)recorderVideoDuration :( CGFloat)duration {
// 録画の進行状況を更新します。
NSLog(@ "ビデオ録画期間: % f" 、期間);
}
- (void)recorderDidStopRecording {
NSLog(@ "レコードストップレコーディング");
if (self.recordState == RecorderStateFinish) {
if (self.aliyunRecorder.clipManager.duration >= self.aliyunRecorder.clipManager.minDuration) {
[self.aliyunRecorder finishRecording];
}
else {
self.recordState = RecorderStatePreviewing;
}
}
}
- (void)recorderWillStopWithMaxDuration {
NSLog(@ "レコードは最大期間で録音を停止します");
[self.aliyunRecorder stopPreview];
}
- (void)recorderDidStopWithMaxDuration {
NSLog(@ "レコードは最大期間で録音しました");
[self.aliyunRecorder finishRecording];
}
- (void)recorderDidFinishRecording {
NSLog(@ "Record Did Finish Recording");
[self.aliyunRecorder stopPreview];
self.recordState = RecorderStateInit;
}
- (void)recoderError :( NSError *)error {
NSLog(@ "Record Occurs Error: % @" 、エラー);
}他のイベント
特別なイベントには、画面ロック、着信、バックグラウンドへの切り替えなどがあります。 UIApplicationWillResignActiveNotificationイベントをリッスンする必要があります。 アプリケーションが非アクティブ状態になる前に、stopRecordingメソッドとstopPreviewメソッドを呼び出してプレビューを停止します。 UIApplicationDidBecomeActiveNotificationイベントもリッスンする必要があります。 アプリケーションがアクティブ状態になったら、startPreviewメソッドを呼び出してプレビューを再開します。