INTEGRITY Документация

Подходы к получению медиа

RealtimeKit предлагает гибкие подходы к получению и управлению медиаданными участников (аудио- и видеодорожками). По умолчанию SDK автоматически получает медиаданные при инициализации. Однако в некоторых сценариях использования требуется доступ к медиадорожкам до инициализации SDK или независимо от неё.

Ручная обработка дорожек недоступна на этой платформе.

Когда использовать пользовательский захват медиаданных

Пользовательский захват медиаданных полезен, когда вам нужно:

Сначала инициализируйте SDK, а затем получите доступ к медиадорожкам через объект встречи. Это самый простой способ, который подходит для большинства сценариев использования.

Когда использовать: Вам нужен доступ к медиатрекам после инициализации SDK для логирования, анализа или интеграции с другими сервисами.

import { useEffect } from 'react';
import { useRealtimeKitClient } from '@cloudflare/realtimekit-react';

export default function App() {
	const [meeting, initMeeting] = useRealtimeKitClient();

    useEffect(() => {
    	initMeeting({ authToken: "<auth-token>" });
    }, []);

    useEffect(() => {
        if(meeting){
            console.log('audioTrack:: ', meeting.self.audioTrack);
            console.log('videoTrack:: ', meeting.self.videoTrack);
        }

    }, [meeting])

    return <div>Your meeting component comes here</div>;

}
const authToken = "<auth-token>";
const meeting = await RealtimeKitClient.init({
	authToken,
});

console.log("audioTrack:: ", meeting.self.audioTrack);
console.log("videoTrack:: ", meeting.self.videoTrack);
class AppComponent {
	title = "MyProject";
	@ViewChild("myid") meetingComponent: RtkMeeting;
	rtkMeeting: RealtimeKitClient;

	async ngAfterViewInit() {
		const meeting = await RealtimeKitClient.init({
			authToken: "<auth-token>",
		});

		console.log("audioTrack:: ", meeting.self.audioTrack);
		console.log("videoTrack:: ", meeting.self.videoTrack);
	}
}

Подход 2: сначала медиа

Сначала инициализируйте обработчик медиа с помощью RealtimeKitClient.initMedia(), затем передайте его в SDK при инициализации. SDK повторно использует полученные медиадорожки, не запрашивая разрешения снова.

Когда использовать: Вам нужно получить медиатреки за несколько минут до присоединения к сессии. Это особенно полезно для платформ тестирования в EdTech, где заранее нужно включить системы прокторинга или отслеживания, не управляя при этом WebSocket-соединениями и не обрабатывая отключения медиа, характерные для полной инициализации SDK.

Преимущества:

  • SDK управляет получением медиаданных и совместимостью с браузером.
  • У участников не запрашивают разрешения дважды.
  • Медиатреки автоматически синхронизируются между вашей службой валидации и SDK.
  • Получайте медиаданные заранее, не решая задачи управления состоянием подключения SDK.
import { useEffect, useState } from 'react';
import RealtimeKitClient from '@cloudflare/realtimekit';
import type { RTKSelfMedia } from '@cloudflare/realtimekit';
import { useRealtimeKitClient } from '@cloudflare/realtimekit-react';

export default function App() {
	const [meeting, initMeeting] = useRealtimeKitClient();
    const [media, setMedia] = useState<RTKSelfMedia>();
    const [readyToInitializeSDK, setReadyToInitializeSDK] = useState(false);

    useEffect(() => {
        async function initMediaWithoutSDKInitialization(){
            const mediaFromSDK = await RealtimeKitClient.initMedia({
              video : true,
              audio: true,
            });

            setMedia(mediaFromSDK);

            console.log('audioTrack', mediaFromSDK.audioTrack);
            console.log('videoTrack', mediaFromSDK.videoTrack);

            setTimeout(() => {
                // Once you are ready to initialize the SDK, set this to true
                // To mimic a real world scenario, we are setting it to true after 5 seconds
                setReadyToInitializeSDK(true);
            }, 5000);
        }
        if(!media){
            initMediaWithoutSDKInitialization();
        }
    }, [media]);

    useEffect(() => {
        if(meeting){
            return;
        }
        if(!readyToInitializeSDK){
            return;
        }
        if(!media){
            return;
        }
    	initMeeting({ authToken: "<auth-token>", defaults: { mediaHandler: media } });
    }, [meeting, readyToInitializeSDK, media]);

    return <div>Your meeting component comes here</div>;
}

Сначала инициализируйте обработчик медиа с помощью RealtimeKitClient.initMedia(), затем передайте его в SDK при инициализации. SDK повторно использует полученные медиадорожки, не запрашивая разрешения снова.

Когда использовать: Вам нужно получить медиатреки за несколько минут до присоединения к сессии. Это особенно полезно для платформ тестирования в EdTech, где заранее нужно включить системы прокторинга или отслеживания, не управляя при этом WebSocket-соединениями и не обрабатывая отключения медиа, характерные для полной инициализации SDK.

Преимущества:

  • SDK управляет получением медиаданных и совместимостью с браузером.
  • У участников не запрашивают разрешения дважды.
  • Медиатреки автоматически синхронизируются между вашей службой валидации и SDK.
  • Получайте медиаданные заранее, не решая задачи управления состоянием подключения SDK.
const mediaFromSDK = await RealtimeKitClient.initMedia({
	video: true,
	audio: true,
});

setTimeout(() => {
	const authToken = "<auth-token>";
	RealtimeKitClient.init({
		authToken,
		defaults: {
			mediaHandler: mediaFromSDK,
		},
	}).then((meeting) => {
		// next - meeting.join();
	});
}, 5000);

Сначала инициализируйте обработчик медиа с помощью RealtimeKitClient.initMedia(), затем передайте его в SDK при инициализации. SDK повторно использует полученные медиадорожки, не запрашивая разрешения снова.

Когда использовать: Вам нужно получить медиатреки за несколько минут до присоединения к сессии. Это особенно полезно для платформ тестирования в EdTech, где заранее нужно включить системы прокторинга или отслеживания, не управляя при этом WebSocket-соединениями и не обрабатывая отключения медиа, характерные для полной инициализации SDK.

Преимущества:

  • SDK управляет получением медиаданных и совместимостью с браузером.
  • У участников не запрашивают разрешения дважды.
  • Медиатреки автоматически синхронизируются между вашей службой валидации и SDK.
  • Получайте медиаданные заранее, не решая задачи управления состоянием подключения SDK.
class AppComponent {
	title = "MyProject";
	@ViewChild("myid") meetingComponent: RtkMeeting;
	rtkMeeting: RealtimeKitClient;

	async ngAfterViewInit() {
		const mediaFromSDK = await RealtimeKitClient.initMedia({
			video: true,
			audio: true,
		});

		setTimeout(() => {
			const authToken = "<auth-token>";
			RealtimeKitClient.init({
				authToken,
				defaults: {
					mediaHandler: mediaFromSDK,
				},
			}).then((meeting) => {
				// next - meeting.join();
			});
		}, 5000);
	}
}

Подход 3: самостоятельное управление (продвинутый уровень)

Получайте и управляйте медиадорожками независимо с помощью API браузера, а затем передавайте их в SDK при включении аудио и видео.

Когда использовать: У вас уже есть инфраструктура управления медиа или требуется полный контроль над получением медиаданных.

Особенности:

Инициализируйте SDK с отключенными аудио и видео, а затем включите их с помощью собственных дорожек:

import { useEffect } from 'react';
import { useRealtimeKitClient } from '@cloudflare/realtimekit-react';

export default function App() {
	const [meeting, initMeeting] = useRealtimeKitClient();

    useEffect(() => {
    	initMeeting({ authToken: "<auth-token>" });
    }, []);

    useEffect(() => {
        async function setupMediaTracks(){
            if (meeting) {
                let audioTrack; // Put the audioTrack that you acquired from browser here
                let videoTrack; // Put the videoTrack that you acquired from browser here
                await meeting.self.enableAudio(audioTrack);
                await meeting.self.enableVideo(videoTrack);
                // await meeting.self.join();
            }
        }
        setupMediaTracks();

    }, [meeting])

    return <div>Your meeting component comes here</div>;

}
const authToken = "<auth-token>";
const meeting = await RealtimeKitClient.init({
	authToken,
});

let audioTrack; // Put the audioTrack that you acquired from browser here
let videoTrack; // Put the videoTrack that you acquired from browser here
await meeting.self.enableAudio(audioTrack);
await meeting.self.enableVideo(videoTrack);
class AppComponent {
	title = "MyProject";
	@ViewChild("myid") meetingComponent: RtkMeeting;
	rtkMeeting: RealtimeKitClient;

	async ngAfterViewInit() {
		const meeting = await RealtimeKitClient.init({
			authToken: "<auth-token>",
		});

		let audioTrack; // Put the audioTrack that you acquired from browser here
		let videoTrack; // Put the videoTrack that you acquired from browser here
		await meeting.self.enableAudio(audioTrack);
		await meeting.self.enableVideo(videoTrack);
	}
}