カスタムストリーム

カスタムストリーム方式は、メディアストリームの手動管理や、より高い柔軟性と制御性を求めるシナリオ(TRTC やライブストリーミングなど)に適しています。 

ステップ 1:SDK を導入

npm パッケージで SDK を参照
npm install tencentcloud-webar
import { ArSdk } from 'tencentcloud-webar';
jsファイルで SDK を参照
<script charset="utf-8" src="https://webar-static.tencent-cloud.com/ar-sdk/resources/latest/webar-sdk.umd.js"></script>
<script>
// window.ARからArSdkクラスを取得
const { ArSdk } = window.AR;
......
</script>

ステップ 2:インスタンスを初期化

1. SDK インスタンスを初期化します。
// 認証パラメータを取得
const authData = {
licenseKey: 'xxxxxxxxx',
appId: 'xxx',
authFunc: authFunc // 詳細は「Licenseの設定と使用 - 署名方法」を参照
};
// SDKのストリームを入力
const stream = await navigator.mediaDevices.getUserMedia({
audio: true,
video: { width: w, height: h }
})
const config = {
module: { // 0.2.0バージョンを追加
beautify: true, // 美顔モジュールのオン・オフ。オンにすると美顔、化粧、ステッカーなどの機能が使用可能
segmentation: true, // シルエット切り抜きモジュールのオン・オフ。オンにすると背景機能が使用可能
segmentationLevel: 0 // 選択可能な値:0 | 1 | 2 、値が高いほど切り抜き効果が良くなり、リソース使用量が多くなり、ハイスペックのデバイスハードウェアが求められます
},
auth: authData, // 認証パラメータ
input: stream, // inputストリームを入力
beautify: { // 美顔パラメータを初期化(任意)
whiten: 0.1,
dermabrasion: 0.3,
eye: 0.2,
chin: 0,
lift: 0.1,
shave: 0.2,
// より多くの美顔パラメータ設定については「APIドキュメント」を参照してください
},
// より多くのパラメータ設定については「APIドキュメント」を参照してください
}
const sdk = new ArSdk(
// sdk初期化用のconfigオブジェクトを渡します
config
)
注意:
美顔検出とシルエット切り抜きはいずれも読み込み時間とリソース消費がかかるため、初期化設定ではモジュール設定を行うことができ、必要な機能を選択できます。オフにしたモジュールはプリロードや初期化が行われず、関連する効果も設定できません。
2. 入力はメディアストリームの他に、string|HTMLImageElementを渡して画像を処理したり、HTMLVideoElementで video 動画を処理したりすることもサポートしています。
const config = {
auth: authData, // 認証パラメータ
input: 'https://xxx.png', // inputストリームを入力し、imageおよびvideoタグもサポート
}
const sdk = new ArSdk(
// sdk初期化用のconfigオブジェクトを渡します
config
)
// createdコールバックでエフェクトとフィルターのリストを取得してページで表示できます。詳細は「SDKアクセス - パラメータとメソッド」を参照してください
sdk.on('created', () => {
// 内蔵化粧を取得
sdk.getEffectList({
Type: 'Preset',
Label: '化粧',
}).then(res => {
effectList = res
});
// 内蔵フィルターを取得
sdk.getCommonFilter().then(res => {
filterList = res
})
})
// readyコールバックでsetBeautify/setEffect/setFilterなどのレンダリングメソッドを呼び出します
// 詳細は「SDKアクセス - 美顔とエフェクトの設定」を参照してください
sdk.on('ready', () => {
// 美顔を設定
sdk.setBeautify({
whiten: 0.2
});
// エフェクトを設定
sdk.setEffect({
id: effectList[0].EffectId,
intensity: 0.7
});
// フィルターを設定
sdk.setFilter(filterList[0].EffectId, 0.5)
})

ステップ 3:ストリームを再生

ArSdk.prototype.getOutputメソッドを使用して出力メディアストリームを取得できます。
異なるコールバックイベントで取得した出力ストリームには若干の違いがあり、異なるシナリオに適しています。必要に応じて選択してください。
早い画面表示速度を求める場合、cameraReadyコールバックで出力ストリームを取得して再生できます。この時点では SDK はまだリソースのロードと検出が初期化されていないため、最初は元の画面のみ表示され、SDK 検出の初期化が完了すると美顔が自動的に適用されます。
sdk.on('cameraReady', async () => {
// cameraReadyコールバックでより早く出力画面を取得できますが、この時点では初期化時に設定した美顔パラメータはまだ適用されておらず、入力画面と同じです
// できるだけ早く画面を表示したい、かつ画面が表示されたときに美顔を適用しないシナリオに適します
// 美顔が有効になってもstreamを更新する必要はなく、SDK内部で既に処理済みです
const output = await ar.getOutput();
// videoを使用して出力メディアストリームを再生し、効果をプレビューします
const video = document.createElement('video')
video.setAttribute('playsinline', '');
video.setAttribute('autoplay', '');
video.srcObject = output
document.body.appendChild(video)
video.play()
})
美顔が適用された後に再生したい場合は、ready コールバックで出力を取得して再生します。
sdk.on('ready', async () => {
// readyコールバックで出力画面を取得すると、この時点で初期化時に設定した美顔パラメータが既に有効になっており、取得したoutput streamには既に美顔効果が適用されています
// 上記のcameraReadyでのoutput streamの取得と異なり、このコールバックの実行タイミングはやや遅いため、画面が表示されるとすぐに美顔を適用したい、かつ画面をすぐに表示しないシナリオに適します
const output = await ar.getOutput();
// videoを使用して出力メディアストリームを再生し、効果をプレビューします
const video = document.createElement('video')
video.setAttribute('playsinline', '');
video.setAttribute('autoplay', '');
video.srcObject = output
document.body.appendChild(video)
video.play()
})

ステップ 4:出力内容を取得

出力MediaStreamを取得した後、サードパーティーSDK(TRTC Web SDK、クイックライブ配信 Web SDK など)を利用してプッシュストリームなどの後続処理を行うことができます。
const output = await sdk.getOutput()
プッシュストリームなどの操作については TRTC プッシュストリームと統合 および WebRTC プッシュストリームと統合 を参照してください。
注意:
input 画像の場合、デフォルトでは string タイプの DataURL が返されますが、getOutput(OUTPUT_TYPES.MEDIA_STREAM)を設定することで強制的にMediastreamを返すこともできます。その他の入力シナリオではすべてMediaStreamタイプが返されます。
出力メディアストリームのvideoトラックはArSdkによってリアルタイムで処理され、audioトラックがある場合はそのまま維持されます。
getOutput メソッドは非同期メソッドであり、SDK が一連の初期化作業を完了してストリームを生成できるようになるまで返されません。
getOutput メソッドは FPS パラメータを渡すことをサポートしており、出力フレームレートを FPS(例えば15)に設定します。指定しない場合はデフォルトで入力ストリームのフレームレートを使用します。
getOutput は複数回実行でき、実行するたびに新しいメディアストリームが生成されます。これは異なるフレームレートのメディアストリームを出力するシナリオ(例えば、プレビュー時に高フレームレートストリームを使用し、プッシュストリーム時に低フレームレートストリームを使用するなど)に利用できます。

ステップ 5:美顔とエフェクトを設定

詳細は 顔加工とエフェクトの設定 をご参照ください。

入力ストリームの更新(0.1.19バージョン以降でサポート)

デバイスの切り替えやカメラの起動停止などを行う必要がある場合、新しいストリームを sdk に入力する必要があります。sdk を複数回初期化しないでください。直接sdk.updateInputStreamで入力ストリームを切り替えることができます。
以下では、コンピュータのデフォルトカメラと外付けカメラの切り替えを例にして updateInputStream の使い方を説明します:
async function getVideoDeviceList(){
const devices = await navigator.mediaDevices.enumerateDevices()
const videoDevices = []
devices.forEach((device)=>{
if(device.kind === 'videoinput'){
videoDevices.push({
label: device.label,
id: device.deviceId
})
}
})
return videoDevices
}
async function initDom(){
const videoDeviceList = await getVideoDeviceList()
let dom = ''
videoDeviceList.forEach(device=>{
dom = `${dom}
<button id=${device.id} onclick='toggleVideo("${device.id}")'>${device.label}<nbutton>
`
})
const div = document.createElement('div');
div.id = 'container';
div.innerHTML = dom;
document.body.appendChild(div);
}
async function toggleVideo(deviceId){
const stream = await navigator.mediaDevices.getUserMedia({
video: {
deviceId,
width: 1280,
height: 720,
}
})
// sdkが提供する入力ストリーム更新インターフェースを使用します
// 入力ストリームが更新された後、再度getOutputを呼び出す必要はなく、SDK内部で既に処理済みです
sdk.updateInputStream(stream, true) // 2番目のパラメータはデフォルトでtrueとなり、古いmediaTrackがstopされます。業務側で保持する必要がある場合は、falseに設定できます。
}
initDom()

顔検出の有効化、無効化

検出を一時停止すると CPU の使用を節約できます。この時も画面出力(エフェクトなし)が続きます。業務ロジックで一時的に検出を停止する必要がある場合は、disable および enable インターフェースを呼び出して手動で起動停止できます。
<button id="disable">検出停止</button>
<button id="enable">検出開始</button>
// 検出を停止し、元の画面を出力します
disableButton.onClick = () => {
sdk.disable()
}
// 検出を開始し、美顔などのエフェクトが適用された画面を出力します
enableButton.onClick = () => {
sdk.enable()
}

画面の再生、一時停止

stop および resume インターフェースを使用して、出力画面の一時停止、再生設定を行うことができます。一時停止状態では画面は静止状態で、再生が停止します。
<button id="stop">一時停止</button>
<button id="resume">再開</button>
// 一時停止
stopButton.onClick = () => {
sdk.stop()
}
// 再生再開
resumeButton.onClick = () => {
sdk.resume()
}