Verwendung des FreeSwitch SIP-Servers zum Erstellen von Videokonferenzsoftware wie callab.me – im Vergleich zum Kurento Media Server

        Dieser Artikel beschreibt unsere Erfahrungen mit dem FreeSwitch (FS) SIP-Server für unser Videokonferenz-SaaS  Callab.me , der den Kurento-Medienserver für unsere professionellen Benutzer ersetzt.

Callab.me nutzt die FreeSwitch-Technologie, um seinen Kunden HD-Konferenzen und Live-Streaming anzubieten

        Erstens ist die Einrichtung und das Verständnis von FS viel komplizierter als bei Kurento. Daher möchte ich zunächst über Kurento Media Server (KMS) sprechen. Es handelt sich um ein europäisches Open-Source-Projekt aus Spanien, das immer noch gepflegt wird und sehr einfach zu bedienen ist. Es verfügt über mehrere Tutorials, mit denen Sie in sehr kurzer Zeit einfache Videokonferenzsoftware erstellen können. Weitere Informationen finden Sie hier: Java – Gruppenanruf – Dokumentation zu Kurento 6.14.0

        Kurento unterstützt NodeJS und Java im Backend und stellt auch eine JS-Bibliothek für das Frontend bereit: https://github.com/Kurento/kurento-utils-js  Da es sich um eine ältere Bibliothek handelt, verwendet sie veraltete und veraltete WebRTC-Methoden, die wir umgestaltet haben es und stellte die Ergebnisse als Open Source zur Verfügung. Zum jetzigen Zeitpunkt wurde die PR noch nicht zusammengeführt. Ich empfehle die Verwendung unserer aktualisierten Version, da sie auf allen gängigen Browsern funktioniert, einschließlich. Mobile Browser: Allgemeine Umgestaltung und Aktualisierung der verwendeten APIs von piranna · Pull Request #34 · Kurento/kurento-utils-js · GitHub

        Mit Kurento können Sie die Videos der Teilnehmer untereinander weitergeben. Damit lässt sich eine einfache Videokonferenz aufbauen, ähnlich wie bei Jitsi oder anderen Lösungen per Videostreaming. Es ermöglicht Ihnen auch die Verwendung von MUX, was im Kurento-Kontext als Komposition bezeichnet wird.

        Ein Multiplexer kombiniert die Videostreams vieler Benutzer zu einem einzigen Stream und gibt jedem Benutzer eine Position im Multiplexer. Dies reduziert die für jeden Client erforderliche Leistung und verbessert gleichzeitig die Audioqualität . Warum: Stellen Sie sich vor, es wären 10 Personen in einem Konferenzraum. Jeder schickt seine Videos an alle anderen. Als Ergebnis empfängt jeder 10 Video- und Audiostreams und sendet 1 Audio- und Videostream, also insgesamt 22 Streams. Bei Verwendung eines MUX mit 10 Teilnehmern empfangen Sie 1 Audio + 1 Videostream und senden 1 Audio + Video. Das ergibt 4 statt 22. Großartig für den Kunden, da er den Audiostream nicht zu den Lautsprechern mischen oder sich mit 22 parallelen Verbindungen befassen muss. Es eignet sich auch gut zum Netzwerken. Andererseits muss der Server, der den Medienserver hostet, mehr Arbeit leisten, um einen Multiplexer zu generieren, der alle Video- und Audiostreams zusammenführt. Daher ist der Einsatz eines Multiplexers bei größeren Konferenzen sinnvoll, erfordert jedoch CPU-Leistung.

        Der Grund, warum wir auf FreeSwitch umgestiegen sind, war die Anpassbarkeit des Video-Multiplexers. In Kurento können Sie mit Position oder Farbe fast nichts machen, aber in Freeswitch können Sie sehr flexible Mux-Layouts entwerfen und Farben und sogar Hintergrundbilder ändern. Ein weiterer Grund ist die Möglichkeit zum Streamen. Während es in Kurento theoretisch möglich ist, mit ffmpeg Streams auf YouTube oder Facebook zu muxen, unterstützt FreeSwitch standardmäßig Streaming über RTMP (Hinweis: RTMPS wird noch nicht unterstützt). Schließlich ist FS ein SIP-Server, der typischerweise von Telefonanbietern verwendet wird und es Ihnen ermöglicht, Benutzern ganz einfach die Möglichkeit zu geben, sich per Telefon einzuwählen.

        Ein wichtiges Kennzeichen gegen FS ist die Dokumentation. Es ist viel komplexer als Kurento, da es sehr offen ist und über viele nützliche Module verfügt. Und irgendwann war es nicht mehr gut gepflegt. Ein guter Einstieg in die Anwendung ist das Erlernen der grundlegenden Methoden anhand einiger Bücher oder Online-Kurse.

        In diesem Artikel gebe ich Ihnen eine kurze Einführung in die grundlegende Einrichtung und Nutzung von Videokonferenzen.

Bei FreeSwitch haben wir die folgenden wichtigen Schlüsselwörter:

Verzeichnis :

        Dies ist die Liste der Benutzer, die sich beim FreeSwitch-Server anmelden und dort registrieren dürfen. Die Registrierung bei einem SIP-Server ist im Grunde das, was Ihr SIP-Telefon nach der Eingabe seiner Zugangsdaten tut: Es teilt dem Server mit: „Ich bin hier und warte darauf, angerufen zu werden.“ Nach der Registrierung können Benutzer Anrufe entgegennehmen oder Anrufe tätigen, sofern dies zulässig ist.

Wählplan Wählplan:

        Dabei handelt es sich um eine komplexe Liste von Aktionen, die der Server ausführt, wenn Sie eine Nummer wählen. Viele Beispiele in der Demo-Installation, wie Voicemail, Essensbestellung, Valet-Parking und mehr, zeigen, was möglich ist.

— XML_CURL:

        Dies ist ein Modul von FS ( mod_xml_curl | FreeSWITCH-Dokumentation ), das es uns ermöglicht, Konfigurationsdateien von WebAPI anzufordern, die eine Verbindung zur Datenbank herstellen können. Diese Dateien werden normalerweise als XML-Dateien auf dem Server gespeichert. Wir werden dies für Verzeichnisse und Wählpläne tun.

· ESL ( Event Socket Library ): ESL ist eine großartige Funktion, die es uns ermöglicht, jede Anwendung (z. B. eine Backend-Java-Anwendung) mit dem Freeswitch-Server zu verbinden und einige Vorgänge auszuführen. Wenn Sie Freeswitch auf einem Server installieren, erhalten Sie den Befehl fs_cli zum Ausführen von Vorgängen. Die Verwendung von fs_cli ist genau die gleiche wie bei ESL. Sie können alle auf dem Server auftretenden Ereignisse empfangen und Aktionen ausführen. Es gibt clientseitige Implementierungen für Java und NodeJS (und sogar Python, Ruby usw.).

SetupWebAPI

        Klonen Sie unser Demo-Repository (  GitHub - mxk1011/fs_demo  ) auf Ihren Webserver und stellen Sie es dem FreeSwitch-Server zur Verfügung. Wenn unser FreeSwitch einen Wählplan oder ein Verzeichnis benötigt, stellt er eine Verbindung zu diesem her. Dies sollte nicht der Öffentlichkeit preisgegeben werden!

Schauen wir uns beide genauer an, beginnend mit dem Wählplan:

Wählplan

<?php
    // User $_GET['Caller-Caller-ID-Number'] is calling a number

    if($_GET['Caller-Caller-ID-Number'] === '1000' || $_GET['Caller-Caller-ID-Number'] === '1001') {
        $conferenceName = 'internal';
    } else {
        $conferenceName = 'external';
    }
?><document type="freeswitch/xml">
    <section name="dialplan" description="RE Dial Plan For FreeSwitch">
        <context name="public">
            <extension name="Media Server">
                <condition field="destination_number" expression="^(999)$">
                    <action application="answer"/>
                    <action application="conference" data="<?php echo $conferenceName; ?>@myprofile"/>
                </condition>
            </extension>
        </context>
    </section>
</document>

        Wir sehen, dass FreeSwitch über eine URL-Abfrage Parameter für das PHP-Skript bereitstellt. Versuchen Sie, sie alle zu bekommen und anzusehen. Es gibt viele davon, darunter interne Variablen, Servernamen, Rufnummern und weitere nützliche Informationen zum Schreiben von Skripten in WebAPI. In diesem einfachen Beispiel verwenden wir einfach die Nummer des Anrufers, um herauszufinden, zu welchem ​​Konferenzraum der Benutzer hinzugefügt werden soll. Die Benutzer 1000 und 1001 werden mit dem Namen „Intern“ zur Konferenz hinzugefügt und alle anderen Benutzer sind „Extern“. Der hier verwendete Wählplan ist sehr einfach:

  • 1. Hören Sie auf alle eingehenden Anrufe an Nummern, die dem regulären Ausdruck ^(999)$ entsprechen, was bedeutet, dass 999 angerufen wird.
  • 2. Nehmen Sie den Anruf sofort entgegen
  • 3. Übermitteln Sie den Benutzer mithilfe des Namens, den wir im PHP-Skript festgelegt haben, an das Meeting.

        Der Vorteil besteht darin, dass FS diese Datei bei jedem Anruf anfordert. Es gibt also kein Caching und Sie können es als Tool verwenden, um Benutzer dynamisch durch Ihre SIP-Anwendung weiterzuleiten. Sie können den Beispiel-Wählplan in FS anzeigen, der weitere Möglichkeiten von Wählplänen zeigt: https://github.com/signalwire/freeswitch/tree/master/conf/sbc/dialplan

Das Verzeichnis

        Wie oben erwähnt, ist ein Verzeichnis eine Liste von Benutzern, die sich im FS-Kontext anmelden und anrufende/angerufene Anrufe durchführen dürfen. Wir verwenden XML_CURL, sodass wir Benutzer nicht in lokalen XML-Dateien auf dem FS-Server speichern, was der Standardanwendungsfall bei der Neuinstallation von FS ist. Sehen Sie sich hier das Standardverzeichnis von FS an: https://github.com/signalwire/freeswitch/tree/master/conf/testing/directory/default

        In diesem Standardverzeichnis haben wir eine XML-Datei, die den Namen, das Passwort und benutzerspezifische Einstellungen für jeden Benutzer festlegt. In unserem Beispiel definieren wir das alles in einer PHP-Datei und geben die Ergebnisse als XML aus.

<?php

    $users = [
        [
            'number' => '1000',
            'password' => 'mypassword',
            'name' => 'User 1000',
            'myVar' => '1234',
        ],
        [
            'number' => '1001',
            'password' => 'mypassword',
            'name' => 'User 1001',
            'myVar' => '1234',
        ],
        [
            'number' => '1002',
            'password' => 'mypassword',
            'name' => 'User 1002',
            'myVar' => '1234',
        ]
    ];

?><document type="freeswitch/xml">
    <section name="directory">
        <domain name="example.com">
            <params>
                <param name="dial-string" value="{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/>
            </params>
            <groups>
                <group name="default">
                    <users>
                        <?php
                            foreach($users as $user) {
                        ?>
                        <user id="<?php echo $user['number']; ?>">
                            <params>
                                <param name="password" value="<?php echo $user['password']; ?>"/>
                            </params>
                            <variables>
                                <variable name="accountcode" value="<?php echo $user['number']; ?>"/>
                                <variable name="user_context" value="public"/>
                                <variable name="effective_caller_id_name" value="<?php echo $user['name']; ?>"/>
                                <variable name="effective_caller_id_number" value="<?php echo $user['number']; ?>"/>
                                <variable name="outbound_caller_id_name" value="<?php echo $user['name']; ?>"/>
                                <variable name="outbound_caller_id_number" value="<?php echo $user['number']; ?>"/>
                                <variable name="mySuperVariable" value="<?php echo $user['myVar']; ?>" />
                            </variables>
                        </user>
                        <?php } ?>
                    </users>
                </group>
            </groups>
        </domain>
    </section>
</document>

        Sie können wie im Beispiel vorgehen und alle vorhandenen Benutzer ausgeben oder aus den URL-Parametern ermitteln, welcher Benutzer sich anmelden möchte, und nur diesen Benutzer ausgeben. Dadurch wird der notwendige Verkehr reduziert. Auch hier wird die Datei nicht von FS zwischengespeichert und bei jedem Anmeldeversuch angefordert. Um WebAPI vor DDoS zu schützen, empfehle ich die Verwendung von Fail2Ban auf dem FS-Server (das möglicherweise bald zu diesem Tutorial hinzugefügt wird), um alle Benutzer zu sperren, die beispielsweise fünf Mal fehlgeschlagene Anmeldeversuche hatten.

Richten Sie den Freeswitch-Server ein

        Sie können natürlich die Dokumentation lesen und FS direkt auf dem Server installieren oder es manuell aus dem Quellcode erstellen (  GitHub – signalwire/freeswitch: FreeSWITCH ist ein Software Defined Telecom Stack, der die digitale Transformation von proprietären Telekommunikations-Switches zu einer vielseitigen Software-Implementierung ermöglicht, die läuft auf jeder handelsüblichen Hardware. Von einem Raspberry PI bis zu einem Multi-Core-Server kann FreeSWITCH das Telekommunikationspotenzial jedes Geräts freisetzen.  ), aber in diesem Tutorial verwenden wir Docker, um den Server zu erstellen. Wir haben eine Docker-Datei vorbereitet, siehe hier:  https://github.com/mxk1011/fs_demo/blob/master/mediaserver/freeswitch/Dockerfile , die Sie problemlos auf jedem Server mit installiertem Docker ausführen können.

Git Klon xxx

CD-Medienserver

wir .env

Bearbeiten Sie die .env-Datei und geben Sie die URL Ihres Webapi als MAINAPI_URL an

Docker-Compose-Build

Docker-Komponieren

Dadurch werden der FreeSwitch-Server und unsere Beispiel-Java-Anwendung ausgeführt. Sie können jederzeit laufen

docker-compose exec freeswitch fs_cli

Geben Sie die FS-CLI-Anwendung ein.

JS-Frontend

        Es gibt viele SIP-Implementierungen in JavaScript, wir verwenden die JsSIP-Bibliothek:  https://github.com/versatica/JsSIP

Sie können unser Mini-Beispiel oder das Beispiel von Harold Thetiot verwenden:  https://github.com/cordova-rtc/cordova-plugin-iosrtc-sample/blob/master/www/js/index-jssip.js  – eigentlich , was ist im nächsten Schritt der Entwicklung von iOS- oder Android-Anwendungen mit Apache Cordova sehr nützlich. Das iosrtc-Paket ist das fehlende Bindeglied zwischen nativem WebRTC und Cordova-Rendering und Hybridanwendungen. Sie finden es hier: GitHub – cordova-rtc/cordova-plugin-iosrtc: Cordova iOS-Plugin, das die WebRTC W3C-API verfügbar macht

        Geben Sie einfach den Hostnamen des FS-Servers und den Benutzer ein, den wir im Webapi definiert haben. Wählen Sie dann 999 und Sie werden zur Videokonferenz verbunden. Wenn Sie index2.html öffnen und dasselbe in einem anderen Browser oder Browser-Tab tun, sehen Sie Ihr Video zweimal im Meeting und sehen, wie der Video-Muxer läuft.

Der Video-Mux- Video-Multiplexer

        Wie oben erwähnt, kann FreeSwitch zum Betrieb des Video-Multiplexers verwendet werden. Hier sind einige mögliche Beispiele. Um den Multiplexer zu steuern, müssen Sie ESL (siehe unten) oder fs_cli (siehe oben) verwenden.

Angenommen, Sie öffnen fs_cli mit docker-compose exec freeswitch fs_cli und geben Folgendes ein, wenn Sie mit dem JS-Frontend eine Verbindung zur Sitzung herstellen:

Besprechungsliste

Es wird etwa Folgendes ausgegeben:

freeswitch@748c8fabad44> conference list
+OK Conference b5a018c0-db16–11ea-ae02-a7ad2187db66 (1 member rate: 48000 flags: running|answered|enforce_min|dynamic|exit_sound|enter_sound|video_rfc4579|livearray_sync|transcode_video|video_muxing|minimize_video_encoding|manage_inbound_bitrate|json_status|video_required_for_canvas)
102;sofia/internal/[email protected];12505e57-c0c7–4464–8ef5-c5ab10410826;Veedeo.me Web;529075307;hear|speak|video|res-id:1;0;0;200

Dadurch erhalten wir Informationen über alle aktiven Treffen und deren Mitglieder. Wir haben hier also ein Meeting mit der ID b5a018c0-db16–11ea-ae02-a7ad2187db66. Benutzer 102 (Einwahlnummer 529075307) hört gerade zu, spricht, hat Video und ist auf Reservierungs-ID 1 platziert.

Jetzt machen wir Folgendes:

Konferenz b5a018c0-db16–11ea-ae02-a7ad2187db66 Kick 102

Boom, los geht's, rausgeschmissen aus deinem eigenen Meeting. Stellen wir erneut eine Verbindung her und probieren weitere Befehle aus:

Konferenz b5a018c0-db16–11ea-ae02-a7ad2187db66 vmute 102

Dadurch wird Ihr Video stummgeschaltet.

Konferenz b5a018c0-db16–11ea-ae02-a7ad2187db66 vid-banner {font_face=Rubik-Regular.ttf,font_scale=5,bg=#f5f7fa,fg=#514654,min_font_size=8,max_font_size=14}Hallo

        Dadurch wird unter dem Videostream ein Banner mit dem Text „Hallo“ platziert, wobei die Schriftart Rubik-Regular aus dem Schriftartenordner verwendet wird (öffnen Sie Google Fonts).

Schauen Sie sich diese Seite an, um alle verfügbaren Befehle zu finden: https://freeswitch.org/confluence/display/FREESWITCH/mod_conference

Video-LayoutsVideo- Layouts

Wenn Sie die Konfigurationsdatei „conferences_layouts.xml“ anzeigen, finden Sie viele vordefinierte Layouts, die Ihre Anwendung verwenden kann. Zum Beispiel

<layout name="2x2" auto-3d-position="true">
    <image x="0" y="0" scale="180"/>
    <image x="180" y="0" scale="180"/>
    <image x="0" y="180" scale="180"/>
    <image x="180" y="180" scale="180"/>
</layout>

Die Logik ist eigentlich ganz einfach:

        Jedes definierte Raster ist immer 360 Einheiten (nicht Pixel!) breit und 360 Einheiten hoch. Sie können „scale“ verwenden, um Breite und Höhe für ein Bild (gleichzeitig) anzugeben, oder „ hscale“ und „scale“ zusammen verwenden , um unterschiedliche Höhen und Breiten zu erhalten. Bilder können auch die folgenden Eigenschaften haben:

  • booking_id: die eindeutige ID des Bildes
  • Zoom: Wenn „true“, wird immer das gesamte Bild ohne schwarze Quadrate an den Seiten ausgefüllt
  • Überlappung: Wenn sich die Bilder überlappen, informieren Sie FS darüber und es wird feststellen, ob es ästhetisch nicht ansprechend ist

Um das aktuelle Layout zu ändern, führen Sie es einfach aus

Konferenz-xyz-Videolayout 2x2

Nachfolgend finden Sie einige Layouts mit Buchungs-IDs:

<layout name="presenter-overlap-large-top-right">
    <image x="0" y="0" scale="360" floor-only="true"/>
    <image x="180" y="0" scale="180" overlap="true" reservation_id="presenter"/>
</layout>

        Reserve ID ist ein Tool, das jedem Bild eine eindeutige ID gibt und den Benutzer an diesen besonderen Ort versetzt. Verwenden Sie dazu den folgenden Befehl:

Konferenz xyz vid-res-id Moderator

        Natürlich sollte das Layout mit der Reservierungs_ID-Präsentation derzeit aktiv sein. Eine gute Idee, die vollständige Positionierung selbst zu verwalten, besteht darin, allen Bildern eine Reservierungs-ID zu geben und die Platzierung über einen über ESL verbundenen Anwendungsserver zu verwalten. In diesem Fall kennen Sie immer die X-, Y-, Breite- und Höhenwerte des Benutzers und können eine spezielle Benutzeroberfläche auf der Videoleinwand platzieren, wie wir es bei Callab.me getan haben

Aufnahme und Streaming

        Ja, mit FreeSwitch können Sie Ihre Sitzung auch in einer Datei aufzeichnen und sie sogar auf Twitch, YouTube oder einen anderen RTMP-kompatiblen Dienst streamen. Bitte beachten Sie, dass FreeSwitch RTMPS noch nicht unterstützt. Mal sehen, ob die Community es bald integriert.

Um die aktuelle Besprechung in einer Datei aufzuzeichnen, gehen Sie einfach wie folgt vor

Konferenz-xyz-Datensatz /var/videorecordings/mysession.mp4

Oder gehen Sie zum Streamen wie folgt vor:

Konferenz-xyz-Datensatz rtmp://my-service.com/?id=1234

Event-Socket-Bibliothek

        Mit FS können Sie alle Vorgänge ausführen und alle Ereignisse über eine Remote-Socket-Verbindung empfangen, genau wie in fs_cli. In unserem Beispiel-Repository haben wir Port 8021 für interne Socket-Verbindungen geöffnet. HINWEIS: Schließen Sie immer diesen Port auf dem Server. Das Offenlegen des ESL-Ports kann sehr gefährlich sein, da ein Angreifer als Administrator fungieren könnte, insbesondere wenn Sie das Standardkennwort „ClueCon“ nicht ändern.

In diesem Beispiel verwenden wir die Java ESL-Bibliothek GitHub – esl-client/esl-client: A Fork von http://git.freeswitch.org/git/freeswitch-contrib/tree/dvarnes/java/esl-client . Es gibt auch Implementierungen in NodeJS, Python und anderen Sprachen.

public class FreeSwitchSocketService {
    private static final Logger log = LoggerFactory.getLogger(FreeSwitchSocketService.class);

    protected Execute executor;

    public void start(String host, int port, String password) {
        final Client inboudClient = new Client();
        try {
            inboudClient.connect(new InetSocketAddress(host, port), password, 10);
        } catch (Exception e) {
            // Handle error
        }

        inboudClient.addEventListener((ctx, event) -> {
            if (executor == null && event.getEventHeaders().containsKey("Unique-ID")) {
                executor = new Execute(ctx, event.getEventHeaders()
                        .get("Unique-ID"));
            }

            try {
                log.trace(event.getEventName());

                switch (event.getEventName()) {
                    case "CUSTOM":
                        if (event.getEventHeaders().containsKey("Action") && event.getEventHeaders().get("Action").equals("conference-create")) {
                            log.debug("Conference " + event.getEventHeaders().get("Conference-Name") + " with profile " + event.getEventHeaders().get("Conference-Profile-Name") + " created");
                            conferenceCreated(event);
                        } else if (event.getEventHeaders().containsKey("Action") && event.getEventHeaders().get("Action").equals("add-member")) {
                            memberAdded(event);
                        } else if (event.getEventHeaders().containsKey("Action") && event.getEventHeaders().get("Action").equals("start-talking")) {
                            log.trace("User " + event.getEventHeaders().get("Caller-Caller-ID-Number") + " start talking");
                            speakingEvent(event, true);
                        } else if (event.getEventHeaders().containsKey("Action") && event.getEventHeaders().get("Action").equals("stop-talking")) {
                            log.trace("User " + event.getEventHeaders().get("Caller-Caller-ID-Number") + " stop talking");
                            speakingEvent(event, false);
                        } else if (event.getEventHeaders().get("Action") != null) {
                            log.debug("Action: " + event.getEventHeaders().get("Action"));
                        }
                        break;
                    case "CHANNEL_HANGUP":
                        log.debug("User {} hangup, cause: {}",
                                event.getEventHeaders().get("variable_sip_from_user"),
                                event.getEventHeaders().get("Hangup-Cause"));
                        memberRemoved(event);
                        break;
                }
            } catch (Exception e) {
                // Handle exception
            }
        });
        inboudClient.setEventSubscriptions(IModEslApi.EventFormat.PLAIN, "all");

        log.info("FS Client connected");
    }

    public void clearAllReservationID(String room) {
        doAPICommand("conference", room + " vid-res-id all clear");
    }

    public void applyLayout(String layout) {
        doAPICommand("conference", "vid-layout " + layout);
    }

    public void removeAllMembers(String room) {
        doAPICommand("conference", room + " hup all");
    }

    public void doAPICommand(String command, String args) {
        if(executor == null) {
            log.warn("FS not ready yet, cant execute command " + command + " " + args);
            return;
        }

        log.debug("Executing " + command + " with args " + args);
        executor.BGApiCommand(command, args);
    }

    protected void speakingEvent(EslEvent event, boolean speaking) {
        log.debug("User {} {} speaking", event.getEventHeaders().get("Caller-Caller-ID-Number"), speaking ? "started" : "stopped");
    }

    protected void conferenceCreated(EslEvent event) {
        // Do something
    }

    protected void memberAdded(EslEvent event) {
        // Do something
    }

    protected void memberRemoved(EslEvent event) {
        // Do something
    }
}

        Wenn Sie Ihre Java-Anwendung auch in Docker ausführen (indem Sie sie in docker-compose.yml definieren), können Sie ganz einfach eine Verbindung zu FS herstellen, indem Sie Folgendes verwenden:

FreeSwitchSocketService socketService = new FreeSwitchSocketService();
socketService.start("freeswitch", "8021", "ClueCon");

        Und führen Sie die oben genannten Vorgänge auf dem FS-Server aus einer Java-Anwendung aus. Sie können Java (oder andere Sprachen) verwenden, um einen Websockets-Dienst zu entwickeln, der eine Verbindung zu Ihrem Benutzer-Frontend herstellt und Chats, Beitritte, Administratorberechtigungen und alle grundlegenden Dinge für Sie verwaltet.

Einwahl per Telefon

        Ja, dies ist ein SIP-Server und Sie können dem Meeting beitreten, indem Sie eine Nummer per Telefon oder Mobiltelefon wählen. Sie benötigen jedoch einen SIP-Trunking-Anbieter und den Kauf einer Telefonnummer. Dabei erhalten Sie Ihre eigene Telefonnummer (die überall auf der Welt sein kann) + Zugangsdaten für den SIP-Trunk.

        Sie können sie hier einfügen:  https://github.com/mxk1011/fs_demo/blob/master/mediaserver/freeswitch/config/sip_profiles/external/mysip.xml und der FS wird automatisch im SIP-Serverregister Ihres Anbieters eingetragen. Im Grunde macht er das Gleiche wie der von uns entwickelte JS-Client, er registriert sich beim Server und wartet auf eingehende Anrufe. Dafür benötigen wir einen weiteren Wählplan, daher können Sie diesen verwenden:

<extension name="public_did">
    <condition field="destination_number" expression="^(496131123456789)$">
        <action application="answer" />
        <action application="set" data="dtmf_type=rfc2833"/>
        <action application="start_dtmf" />
        <action application="set" data="sound_prefix=$${sounds_dir}/veedeo/en" />
        <action application="lua" data="veedeo_dialin.lua"/>
    </condition>
</extension>

        Dadurch wird der Anruf entgegengenommen, die Sitzung kann DTMF-Befehle empfangen (das sind im Wesentlichen Zahlen, die Sie während eines Anrufs auf der Wähltastatur drücken) und dann wird veedeo_dialin.lua ausgeführt – dabei handelt es sich um ein in der Lua-Sprache geschriebenes Skript. Sie finden es hier:  https://github.com/mxk1011/fs_demo/blob/master/mediaserver/freeswitch/scripts/veedeo_dialin.lua  – Dieses Skript fragt den Anrufer nach der Konferenz-ID und der PIN. Anschließend wird eine CURL-Anfrage an die Datei check_pin.php ausgeführt, die sich auf unserem Webapi befindet. Bitte ändern Sie die URL in der Lua-Datei in Ihr Webapi. Denn der Check in unserem Webapi ist ganz einfach:

<?php
if($_GET['pin'] === '1234' && $_GET['id'] === '00000000') {
    return 'my-conf-name';
}

Wir können der Konferenz „mein-conf-name“ beitreten, indem wir 0000 und dann 1234 eingeben.

verallgemeinern

        Wir haben einen FreeSwitch-Server erstellt, untersucht, wie man einen Anwendungsserver schreibt, der Websockets verwenden kann, und wie man WebAPI einführt. Natürlich kann es sich bei dem Anwendungsserver und der Webapi um dieselbe Anwendung handeln, die mit derselben Datenbank verbunden ist. Dies sollte jedoch erklären, wie FreeSwitch zur Trennung von Aufgaben verwendet wird. Ich hoffe, dass dieses Tutorial hilfreich war, vielen Dank übrigens fürs Lesen und dass es dabei hilft, die FreeSwitch-Entwickler- und Open-Source-Community zu erweitern, indem es einen allgemeinen Überblick über die Möglichkeiten und den Stack bietet.

        Wenn Sie Fragen haben, können Sie mich gerne kontaktieren. Besonderer Dank geht an Harold Thetiot , der uns FreeSwitch empfohlen und unsere Fragen gestellt, Docker-Konfigurationen, Beispiele und andere nützliche Ressourcen bereitgestellt hat, sowie für seinen Mut im Open-Source -Projekt iosRTC.

Übersetzt aus

https://m-schmidt.medium.com/using-freeswitch-sip-server-to-build-a-video-conferencing-software-f21b68348613

おすすめ

転載: blog.csdn.net/yangyangye/article/details/131942291