
Teilen Sie:
A Software Developer who is geared towards building high performing and innovative products following best practices and industry standards. He also loves writing about backend development.
Erstellen eines Online-Klassenzimmers in Laravel mit Vonage Video API
Lesedauer: 14 Minuten
Dieser Artikel zeigt Ihnen, wie Sie ein Video/Virtuelles Klassenzimmer in Echtzeit mit der Vonage Video API einrichten kann, bei dem der Lehrer an jedem beliebigen Ort der Welt sein kann und trotzdem mit den Schülern in Echtzeit kommunizieren und Vorlesungen halten kann.
Was genau ist Vonage Video API?
Vonage Video API ist ein Service, der es Entwicklern leicht macht, Anwendungen zu erstellen, die WebRTC und nutzen. Web-Sockets nutzen, um Echtzeitkommunikation per Video, Text, Audio und anderen Medien für Webanwendungen, mobile Anwendungen und sogar Desktop-Geräte zu ermöglichen. Sie stellen leistungsstarke SDKs für verschiedene Plattformen zur Verfügung, um diese zu implementieren und den Benutzern die API für ihre Anwendungen zur Verfügung zu stellen.
Wie funktioniert es?
Alle Applikationen, die die Video API von Vonage nutzen, bestehen aus drei Hauptkomponenten, um die sich alles dreht, was Sie tun. Sie sind:
Sitzungen
Server
Kunde
Schauen wir uns jede von ihnen ein wenig genauer an:
Sitzungen
Eine Sitzung kann als ein virtueller Chatraum angesehen werden, in dem die Kommunikation stattfindet. Damit zwei Computer Video oder Audio austauschen können, müssen sie mit der gleichen Sitzung verbunden sein. Sitzungen werden in der Cloud von Vonage API gehostet/gespeichert und haben alle eine eindeutige ID. Die Sitzungen verwalten die Benutzerströme (Video- und Audio-Feed) und verfolgen alle Ereignisse (z. B. wenn Benutzer der Sitzung beitreten, sie verlassen oder eine Textnachricht senden).
Server
Server sind der Backend-Code, den Sie zur Verwaltung der Sitzungen in Ihrer Anwendung schreiben. Damit die Kommunikation stattfinden kann, muss Ihr Server mit der Cloud von Vonage API kommunizieren, um eine Sitzung zu erstellen und die erhaltene Sitzungs-ID zu verwenden, um Token zu generieren, die Clients (Browser und Mobiltelefone) dann verwenden können, um der Sitzung beizutreten und Streams auszutauschen. Damit Ihr Server funktioniert, müssen Sie eines der vielen serverseitigen SDKs von Vonage API verwenden, die für verschiedene serverseitige Sprachen verfügbar sind.
Kunde
Clients sind die Browser oder mobilen Geräte, mit denen Benutzer direkt interagieren, um Video- und Audio-Feeds auszutauschen. Clients benötigen immer ein (von Ihrem Server generiertes) Token, um einer Sitzung beizutreten, damit sie mit anderen Clients in derselben Sitzung interagieren können.
Wenn ein Client verbunden ist, kann er andere Clients in derselben Sitzung veröffentlichen (Video-/Audio-Feed senden) und abonnieren (Audio-/Video-Feed empfangen). Ein Client kann entweder ein Verleger, ein Abonnent oder ein Moderator sein.
Verleger dürfen Audio-/Video-Feeds senden und empfangen. Abonnenten dürfen nicht senden, aber sie erhalten Audio-/Video-Feeds. Moderatoren dürfen tun, was Verleger tun können, aber auch andere Kunden daran hindern, sich anzumelden.
Zusammenfassend lässt sich sagen, dass die Kommunikation bei der Verwendung der Vonage-API folgendermaßen abläuft:
Ihr Server erstellt eine Sitzung in der Vonage API Cloud, die eine eindeutige ID hat. Wenn ein Client beitreten möchte, verwendet Ihr Server die Sitzungs-ID, um ein Token für Ihren Client zu generieren. Der Client tritt der Sitzung bei und veröffentlicht Streams in der Sitzung. Wenn ein anderer Client beitritt, generiert der Server ein neues Token, und die beiden Clients können sich gegenseitig in der Sitzung abonnieren und die Streams des jeweils anderen empfangen.
Einrichten unseres Online-Kurses mit Vonage API
In diesem Tutorial werden wir einen einfachen Video-Feed mit der Vonage API einrichten, der es den Kunden ermöglicht, Audio- und Video-Feeds zu senden. Vonage API stellt ein SDK für PHP zur Verfügung, das wir zur Erstellung unserer virtuellen Klasse verwenden werden.
Einrichten eines Laravel-Projekts
Der erste Schritt bei der Erstellung unserer virtuellen Klasse ist das Einrichten eines Laravel-Projekts.
Es ist wichtig anzumerken, dass zum Zeitpunkt der Erstellung dieses Artikels die Vonage API nicht mit der neuesten Version von Laravel* *(8.x). Dies liegt daran, dass das PHP-SDK der Vonage-API von der Version 6 von GuzzleHTTP abhängt, Laravel 8 jedoch die Version 7 von GuzzleHTTP verwendet. Installieren Sie für dieses Tutorial also bitte die Version 7 von Laravel. Sie können dies tun, indem Sie den Installationsbefehl wie folgt ausführen:
Oder Sie können auch mitmachen, indem Sie das Repository hier.
Installation des Vonage API PHP SDK
Der nächste Schritt ist die Installation des Vonage API PHP SDK. Wir tun dies, indem wir das Paket mit Composer in unser Projekt installieren.
Definieren unserer Migrationen und Modelle
Jetzt müssen wir unsere Lehrer und Schüler definieren, damit sie in unserem virtuellen Klassenzimmer unterschiedliche Berechtigungen haben können. Unsere Anwendung würde zwei Tabellen verwenden - users, um alle Lehrer und Schüler zu speichern, und virtual_classes, um die Sitzungsnummern unserer Klassen zu speichern, damit die Schüler die laufende Klasse sehen können, wenn sie sich anmelden und ihr beitreten. Dies sind die Migrationen für beide Tabellen:
Öffnen Sie die Benutzermigration unter database/migrations/xxxxxx_create_users_xxxx.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
// This enum field tells us if the current user is a teacher or student
$table->enum('user_type', ['Student', 'Teacher']);
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}Öffnen Sie die Migration von virtual_classes unter database/migrations/xxxxxx_create_virtual_classes_xxxx.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateVirtualClassesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('virtual_classes', function (Blueprint $table) {
$table->id();
$table->string("name");
// User id to know which teacher created the class
$table->integer("user_id"); `
$table->string("session_id");
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('classes');
}
}
Danach müssen wir im App-Verzeichnis einen Ordner namens Models erstellen und unsere Modelle dorthin verschieben. Dann aktualisieren wir den Namespace auf App\Models für unsere Modelle. Schließlich aktualisieren wir das Modell User, um user_type zum Array $fillable hinzuzufügen und eine Beziehung zu virtuellen Klassen zu erstellen, damit wir leicht auf sie zugreifen können.
Öffnen Sie das Benutzermodell unter app/Models/Users.php
//REMEMBER TO UPDATE THE NAMESPACE AFTER MOVING THE FILE
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
// DON'T FORGET TO ADD THE USER_TYPE TO THIS ARRAY
protected $fillable = [
'name', 'email', 'password', 'user_type'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
// Relationship tying a virtual class to a user (teacher in our case)
public function myClass() {
return $this->hasOne(VirtualClass::class);
}
} Authentifizierung
Nachdem wir nun unsere Modellarchitektur eingerichtet haben, müssen wir den Benutzern die Möglichkeit geben, sich zu registrieren und anzumelden. Als Erstes müssen wir die Anbieter in unserer Projektkonfiguration bearbeiten. Da wir den Speicherort des Benutzermodells geändert haben, müssen wir diese Änderung berücksichtigen. Zuerst gehen wir zu config/auth.php und bearbeiten das Provider-Array und führen die Befehle aus, um die Authentifizierung einzurichten.
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class, // New location of User model
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
// Rest of auth.php fileDanach führen wir einfach das Standard-Authentifizierungsgerüst von Laravel aus:
Nachdem Sie alle vier Befehle in dieser Reihenfolge ausgeführt haben, sollte Laravel die erforderlichen Ansichten zur Einrichtung der Authentifizierung hinzufügen. Der letzte Schritt bei der Einrichtung unserer Authentifizierung besteht darin, den RegisterController und die Datei register.blade.php zu bearbeiten, um zu wissen, ob ein Benutzer zum Zeitpunkt der Registrierung ein Schüler oder ein Lehrer ist.
Erstens, die app/Http/Controllers/Auth/RegisterController Datei:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
// PLEASE REMEMBER TO CHANGE THE IMPORT STATEMENT HERE
use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default, this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
// Add the user_type here for validation.
'user_type' => ['required', 'string', 'in:Student,Teacher'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'user_type' => $data['user_type'],
'password' => Hash::make($data['password']),
]);
}
}
Dann die Registeransicht. Sie befindet sich in resources/views/auth/register.blade.php:
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Register') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('register') }}">
@csrf
<div class="form-group row">
<label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>
<div class="col-md-6">
<input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
@error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="user_type" class="col-md-4 col-form-label text-md-right">{{ __('User Type') }}</label>
{{-- Note the select box here???--}}
<div class="col-md-6">
<select id="user_type" type="text" class="form-control @error('user_type') is-invalid @enderror" name="user_type" required>
<option value="Student">Student</option>
<option value="Teacher">Teacher</option>
</select>
@error('user_type')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Register') }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Danach sollten wir in der Lage sein, uns entweder als Lehrer oder als Schüler zu registrieren und anzumelden.
Einrichten unseres Servers
Bevor Sie Ihren Server einrichten können, benötigen Sie einen Projekt-API-Schlüssel und ein Geheimnis. Um diese zu erhalten, müssen Sie einen kostenlosen Vonage API Account erstellen. Bitte tun Sie das, indem Sie diesen Link klicken. Sobald Sie dies getan haben und ein Projekt erstellt haben, können Sie gerne zurückkommen und fortfahren :)
Zuerst speichern wir unseren API-Schlüssel und unser API-Geheimnis in unserer .env-Datei in unserem Laravel-Projekt:
### ADD THESE LINES AT THE BOTTOM OF YOUR .env FILE, OR WHEREVER REALLY ###
VONAGE_API_KEY=your_api_key
VONAGE_API_SECRET=your_api_secret
### REST OF .ENV FILE ###Nun müssen wir einen Controller einrichten, um Sitzungen einzurichten und Token für neue Benutzer zu erzeugen. Lassen Sie uns einen erstellen und ihn SessionsController nennen:
Füllen wir sie mit den notwendigen Methoden in app/Http/Controllers/SessionsController.php:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\VirtualClass;
#Import necessary classes from the Vonage API (AKA OpenTok)
use OpenTok\OpenTok;
use OpenTok\MediaMode;
use OpenTok\Role;
class SessionsController extends Controller
{
/** Creates a new virtual class for teachers
*
* @param Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function createClass(Request $request)
{
// Get the currently signed-in user
$user = $request->user();
// Throw 403 if student tries to create a class
if ($user->user_type === "Student") return back(403);
// Instantiate a new OpenTok object with our api key & secret
$opentok = new OpenTok(env('VONAGE_API_KEY'), env('VONAGE_API_SECRET'));
// Creates a new session (Stored in the Vonage API cloud)
$session = $opentok->createSession(array('mediaMode' => MediaMode::ROUTED));
// Create a new virtual class that would be stored in db
$class = new VirtualClass();
// Generate a name based on the name the teacher entered
$class->name = $user->name . "'s " . $request->input("name") . " class";
// Store the unique ID of the session
$class->session_id = $session->getSessionId();
// Save this class as a relationship to the teacher
$user->myClass()->save($class);
// Send the teacher to the classroom where real-time video goes on
return redirect()->route('classroom', ['id' => $class->id]);
}
public function showClassRoom(Request $request, $id)
{
// Get the currently authenticated user
$user = $request->user();
// Find the virtual class associated by provided id
$virtualClass = VirtualClass::findOrFail($id);
// Gets the session ID
$sessionId = $virtualClass->session_id;
// Instantiates new OpenTok object
$opentok = new OpenTok(env('VONAGE_API_KEY'), env('VONAGE_API_SECRET'));
// Generates token for client as a publisher that lasts for one week
$token = $opentok->generateToken($sessionId, ['role' => Role::PUBLISHER, 'expireTime' => time() + (7 * 24 * 60 * 60)]);
// Open the classroom with all needed info for clients to connect
return view('classroom', compact('token', 'user', 'sessionId'));
}
}
Bei der Erstellung des Tokens können wir die Rolle festlegen, die der aktuelle Kunde haben kann. Dies kann entweder Publisher, Subscriber oder Moderator sein. Die Rollen werden oben erklärt. Im obigen Codeschnipsel geben wir allen Nutzern den Status "Publisher", d. h. alle Nutzer können Streams senden und empfangen (Video/Audio-Feed)
Wir müssen eine classroom.blade.php Datei in unserem Ordner resources/views für die showClassroom Methode.
Wir müssen auch Routen für den Controller erstellen. Wir fügen diese Routen in der Datei routes/web.php hinzu:
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
// Add this to your web.php file
// This line makes all routes in it to use the auth middleware, meaning only signed-in users can access these routes
Route::middleware('auth')->group(function () {
// This route creates classes for teachers
Route::post("/create_class", 'SessionsController@createClass')
->name('create_class');
// This route is used by both teachers and students to join a class
Route::get("/classroom/{id}", 'SessionsController@showClassRoom')
->where('id', '[0-9]+')
->name('classroom');
});
Schließlich müssen wir in unserem Dashboard den Lehrern einen Punkt geben, an dem sie Klassen erstellen können, und den Schülern die Liste der Klassen, denen sie beitreten können. Zu diesem Zweck müssen wir den HomeController und die Datei home.blade.php aktualisieren. Lasst uns das tun; ich hoffe, ihr seid alle noch bei mir 🙂 .
Wir beginnen mit dem app/Http/Controllers/HomeController:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\ClassModel as VirtualClass;
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function index(Request $request)
{
$user = $request->user();
$classes = [];
// If user is a student, give her a list of virtual classes
if ($user->user_type === "Student") {
$classes = VirtualClass::orderBy('name', 'asc')->get();
}
return view('home', compact('user', 'classes'));
}
}Nächste resources/views/home.blade.php:
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{$user->user_type}} {{ __('Dashboard') }}</div>
<div class="card-body">
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
@if($user->user_type === "Student")
<h3>These are the ongoing classes available on the system</h3>
@foreach($classes as $key=>$class)
<a href="{{route('classroom', ['id' => $class->id])}}">{{$key + 1}}. {{$class->name}}</a>
<br />
@endforeach
@else
<h4>Welcome {{$user->name}}. Fill the form below to create a class</h4>
<form method="POST" action="{{ route('create_class') }}">
@csrf
<div class="form-group row">
<label for="name" class="col-md-12 col-form-label">{{ __('Class Name') }}</label>
<div class="col-md-6">
<input id="name" type="text"
class="form-control @error('name') is-invalid @enderror" name="name"
value="{{ old('name') }}" required autocomplete="name" autofocus>
@error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-6">
<button type="submit" class="btn btn-primary">
{{ __('Create Class') }}
</button>
</div>
</div>
</form>
@endif
</div>
</div>
</div>
</div>
</div>
@endsection
Dies bietet entweder ein Formular zum Erstellen einer Klasse, wenn der Benutzer ein Lehrer ist, oder eine virtuelle Klassenliste, wenn der Benutzer ein Schüler ist.
Einrichten unseres Clients und Streaming Live Video-Audio Feed
Um den Client einzurichten (der das Web-SDK verwenden würde), müssen wir eine Blade-Datei namens resources/views/classroom.blade.php erstellen, die der showClassroom() Methode in unserem SessionsController zu entsprechen. Die Datei muss einen Link zum CDN des SDK enthalten. Unser Frontend sollte genau so aussehen:
<html>
<head>
<title> OpenTok Getting Started </title>
<style>
body, html {
background-color: gray;
height: 100%;
}
#videos {
position: relative;
width: 100%;
height: 100%;
margin-left: auto;
margin-right: auto;
}
#subscriber {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 10;
}
#publisher {
position: absolute;
width: 360px;
height: 240px;
bottom: 10px;
left: 10px;
z-index: 100;
border: 3px solid white;
border-radius: 3px;
}
</style>
<script src="https://static.opentok.com/v2/js/opentok.min.js"></script>
</head>
<body>
<div id="videos">
<div id="subscriber"></div>
<div id="publisher"></div>
</div>
<script type="text/javascript">
var session;
var connectionCount = 0;
var apiKey = "{{env('VONAGE_API_KEY')}}";
var sessionId = "{{$sessionId}}";
var token = "{{$token}}";
var publisher;
function connect() {
// Replace apiKey and sessionId with your own values:
session = OT.initSession(apiKey, sessionId);
session.on("streamCreated", function (event) {
console.log("New stream in the session: " + event.stream.streamId);
session.subscribe(event.stream, 'subscriber', {
insertMode: 'append',
width: '100%',
height: '100%'
});
});
session.on({
connectionCreated: function (event) {
connectionCount++;
alert(connectionCount + ' connections.');
},
connectionDestroyed: function (event) {
connectionCount--;
alert(connectionCount + ' connections.');
},
sessionDisconnected: function sessionDisconnectHandler(event) {
// The event is defined by the SessionDisconnectEvent class
alert('Disconnected from the session.');
document.getElementById('disconnectBtn').style.display = 'none';
if (event.reason == 'networkDisconnected') {
alert('Your network connection terminated.')
}
}
});
var publisher = OT.initPublisher('publisher', {
insertMode: 'append',
width: '100%',
height: '100%'
}, error => {
if (error) {
alert(error.message);
}
});
// Replace token with your own value:
session.connect(token, function (error) {
if (error) {
alert('Unable to connect: ', error.message);
} else {
// document.getElementById('disconnectBtn').style.display = 'block';
alert('Connected to the session.');
connectionCount = 1;
if (session.capabilities.publish == 1) {
session.publish(publisher);
} else {
alert("You cannot publish an audio-video stream.");
}
}
});
}
connect();
</script>
</body>
</html>
Um die Anwendung zu testen, führen Sie den folgenden Befehl im Stammverzeichnis des Projekts aus.
Öffnen Sie http://localhost:8000/ in Ihrem Browser und klicken Sie auf das Anmeldemenü.
Wenn Sie das richtig gemacht haben, sollten Sie sich mit einem Lehrer- und einem Schülerkonto anmelden und Audio- und Videodaten austauschen.
Log in with a teacher account and a student account and exchange audio and video feed
Wenn Sie mit einem Schüler verbunden sind, sollten Sie diesen Bildschirm sehen.
Connected with a student
Schlussfolgerung
Echtzeit-Applikationen sind erstaunlich. Sie bringen die Welt zusammen, und jetzt, wo die Welt immer weiter entfernt ist, ist die Nachfrage nach solchen Applications groß.
Die Arbeit mit WebRTC und WebSockets für die Echtzeitkommunikation kann mühsam sein, aber die Vonage-API bietet einfache Hilfsmethoden für eine breite Palette von Anwendungsfällen. In diesem Artikel wurde gezeigt, wie man mit Laravel einen Video-Feed einrichtet. Sie können das Repository hier klonen.