Untersuchung des VoIP-Engines Mediastreamer2. Teil 1

Der Inhalt dieses Artikels stammt von meinem Zen-Kanal.

Einführung

Dieser Artikel ist der Auftakt zu einer Reihe von Artikeln über die Echtzeitverarbeitung von Mediendaten mit dem Mediastreamer2-Framework. Dabei sind grundlegende Kenntnisse im Umgang mit dem Linux-Terminal und in der Programmiersprache C erforderlich.

Mediastreamer2 ist eine VoIP-Engine, die der Grundlage des beliebten Open-Source-Projekts des VoIP-Telefons dient. Linphone. In Linphone implementiert Mediastreamer2 alle Funktionen im Zusammenhang mit Audio und Video. Eine detaillierte Liste der Funktionen der Engine finden Sie auf dieser Mediastreamer-Seite. Der Quellcode ist hier verfügbar: GitLab.

Im weiteren Verlauf des Textes werden wir zur Vereinfachung anstelle des Begriffs Mediastreamer2 die russische Bezeichnung „медиастример“ verwenden.

Die Geschichte seiner Entstehung ist nicht ganz klar, aber judging by seinem Quellcode hat er zuvor die Bibliothek Glib, was auf eine mögliche entfernte Verwandtschaft mit GStreamerhinweist. Im Vergleich zu diesem erscheint der Mediastreamer als leichter. Die erste Version von Linphone erschien im Jahr 2001, sodass der Mediastreamer nun schon fast 20 Jahre existiert und sich weiterentwickelt.

Die Grundlage des Mediastreamers bildet eine als „Data Flow“ bezeichnete Architektur. Ein Beispiel für eine solche Architektur ist im folgenden Bild dargestellt.

Untersuchung des VoIP-Engines Mediastreamer2. Teil 1

In dieser Architektur wird der Algorithmus zur Datenverarbeitung nicht durch Programmcode, sondern durch ein Schema (Graph) zum Verbinden von Funktionen definiert, die in beliebiger Reihenfolge angeordnet werden können. Diese Funktionen werden als Filter bezeichnet.

Eine solche Architektur ermöglicht die Implementierung der Medienverarbeitung als eine Reihe von Filtern, die in einem Schema zur Verarbeitung und Übertragung von RTP-Verkehr für VoIP-Telefone verbunden sind.

Die Möglichkeit, Filter in beliebige Schemata zu verbinden, die einfache Entwicklung neuer Filter und die Implementierung des Medienstreamers als eigenständige Bibliothek ermöglichen die Nutzung auch in anderen Projekten. Dabei kann das Projekt im Bereich VoIP sein, da die Möglichkeit besteht, selbst entwickelte Filter hinzuzufügen.

Die standardmäßig mitgelieferte Bibliothek von Filtern ist bereits recht umfangreich und wie bereits erwähnt, kann sie durch selbst entwickelte Filter erweitert werden. Doch zunächst beschreiben wir die fertigen Filter, die mit dem Medienstreamer geliefert werden. Hier ist ihre Liste:

Audio-Filter

Aufnahme und Wiedergabe von Audio

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Android Native Sound (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Audio Queue Service (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Audio Unit Service (Mac OS X)
  • Medien (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Dateiwiedergabe (raw/wav/pcap Dateien) (Linux): MS_FILE_PLAYER
  • Dateiwiedergabe (raw/wav Dateien) (Windows): MS_WINSND_READ
  • Aufnahme in Datei (wav Dateien) (Linux): MS_FILE_REC
  • Aufnahme in Datei (wav Dateien) (Windows): MS_WINSND_WRITE
  • Mac Audio Unit (Mac OS X)
  • MME (Windows)
  • OSS (Linux): MS_OSS_WRITE, MS_OSS_READ
  • PortAudio (Mac OS X)
  • PulseAudio (Linux): MS_PULSE_WRITE, MS_PULSE_READ
  • Windows Sound (Windows)

Audio-Codierung/Dekodierung

  • G.711 a-law: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-law: MS_ULAW_DEC, MS_ULAW_ENC
  • G.722: MS_G722_DEC, MS_G722_ENC
  • G.726: MS_G726_32_ENC, MS_G726_24_ENC, MS_G726_16_ENC
  • GSM: MS_GSM_DEC, MS_GSM_ENC
  • Lineare PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Audioverarbeitung

  • Kanalumwandlung (Mono->Stereo, Stereo->Mono): MS_CHANNEL_ADAPTER
  • Konferenz: MS_CONF
  • DTMF-Generator: MS_DTMF_GEN
  • Echo-Unterdrückung (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mixer: MS_MIXER
  • Packet Loss Compensation (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Ton-Detektor: MS_TONE_DETECTOR
  • Lautstärkeregelung und Pegelmessung: MS_VOLUME

Video-Filter

Videoaufnahme und -wiedergabe

  • Android Aufnahme
  • Android Wiedergabe
  • AV Foundation Aufnahme (iOS)
  • AV Foundation Wiedergabe (iOS)
  • DirectShow Aufnahme (Windows)
  • DrawDib Wiedergabe (Windows)
  • Externe Wiedergabe – Video an die oberste Ebene senden
  • GLX-Wiedergabe (Linux): MS_GLXVIDEO
  • Mire — Synthetisches Bewegungbild: MS_MIRE
  • OpenGL-Wiedergabe (Mac OS X)
  • OpenGL ES2-Wiedergabe (Android)
  • Quicktime-Aufnahme (Mac OS X)
  • SDL-Wiedergabe: MS_SDL_OUT
  • Ausgabe von statischen Bildern: MS_STATIC_IMAGE
  • Video For Linux (V4L) Aufnahme (Linux): MS_V4L
  • Video For Linux 2 (V4L2) Aufnahme (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) Aufnahme (Windows)
  • Video4windows (DirectShow) Aufnahme (Windows CE)
  • Video For Windows (vfw) Aufnahme (Windows)
  • XV-Wiedergabe (Linux)

Video-Encoding/Decoding

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snow: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (nur Decoder): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Videoverarbeitung

  • JPEG-Snapshot
  • Pixel-Format-Konverter: MS_PIX_CONV
  • Resize-Filter
  • Andere Filter
  • Datenblock-Austausch zwischen Threads: MS_ITC_SOURCE, MS_ITC_SINK
  • Zusammenführung von Datenblöcken von mehreren Eingängen zu einem Ausgang: MS_JOIN
  • RTP Empfang/Übertragung: MS_RTP_SEND, MS_RTP_RECV
  • Eingabedaten auf mehrere Ausgänge kopieren: MS_TEE
  • Konsistenter Payload: MS_VOID_SINK
  • Stillen-Quelle: MS_VOID_SOURCE

Plugins

Audio-Filter

  • AMR-NB Encoder/Decoder
  • G.729 Encoder/Decoder
  • iLBC Encoder/Decoder
  • SILK Encoder/Decoder

    Video-Filter

  • H.264 Software-Encoder
  • H.264 V4L2 Encoder/Decoder mit Hardwarebeschleunigung

Nach einer kurzen Beschreibung des Filters wird der Typname angezeigt, der bei der Erstellung einer neuen Instanz dieses Filters verwendet wird. In der weiteren Ausführung werden wir uns auf diese Liste beziehen.

Installation unter Linux Ubuntu

Jetzt werden wir den Medienstremer auf dem Computer installieren und unsere erste Anwendung damit erstellen.

Die Installation von Mediastremer2 auf einem Computer oder einer virtuellen Maschine unter Ubuntu erfordert keine besonderen Fähigkeiten. Im Folgenden wird das Zeichen „$“ das Shell-Eingabeaufforderungssymbol für die Eingabe von Befehlen bezeichnen. Das bedeutet, wenn Sie in der Ausgabe dieses Symbols am Anfang einer Zeile sehen, handelt es sich um eine Zeile, in der die Befehle zur Ausführung im Terminal angezeigt werden.

Es wird vorausgesetzt, dass Ihr Computer während der Ausführung der in diesem Artikel beschriebenen Aktionen Zugang zum Internet hat.

Installation des Pakets libmediastremer-dev

Starten Sie das Terminal und geben Sie den Befehl ein:

$ sudo apt-get update

Es wird nach einem Passwort für Änderungen gefragt, geben Sie es ein, und der Paketmanager aktualisiert seine Datenbanken. Danach sollten Sie Folgendes ausführen:

$ sudo apt-get install libmediastreamer-dev

Die erforderlichen Abhängigkeitspakete und die Medienstremer-Bibliothek werden automatisch heruntergeladen und installiert.

Die Gesamtheit der heruntergeladenen Abhängigkeit-Pakete wird etwa 35 MB betragen. Informationen über das installierte Paket können Sie mit dem Befehl abrufen:

$ dpkg -s libmediastreamer-dev

Beispielantwort:

Paket: libmediastreamer-dev
Status: installiert ok
Priorität: optional
Kategorie: libdevel
Installierte Größe: 244
Betreuer: Ubuntu-Entwickler 
Architektur: amd64
Quelle: linphone
Version: 3.6.1-2.5
Abhängigkeiten: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Beschreibung: Medienbibliothek von Linphone Web-Telefon - Entwicklungsdateien
Linphone ist ein Audio- und Video-Internettelefon, das das SIP-Protokoll verwendet. Es hat eine GTK+- und Konsolenschnittstelle, umfasst eine große Vielfalt an Audio- und Video-Codecs und bietet IM-Funktionen.
.
Dieses Paket enthält die Entwicklungsbibliotheken für die Medienoperationen.
Ursprünglicher Betreuer: Debian VoIP-Team 
Homepage: http://www.linphone.org/

Installation der Entwicklungstools

Wir installieren den C-Compiler und die dazugehörigen Werkzeuge:

$ sudo apt-get install gcc

Überprüfen Sie das Ergebnis, indem Sie die Version des Compilers anfragen:

$ gcc --version

Die Antwort sollte etwa so aussehen:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Dies ist freie Software; siehe die Quelle für die Kopierbedingungen. Es gibt KEINE
Garantie, nicht einmal für MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.

Kompilierung und Ausführung einer Testanwendung

Wir erstellen im home Ordner für unsere Übungsprojekte und nennen ihn mstutorial:

$ mkdir ~/mstutorial

Nutzen Sie Ihren bevorzugten Texteditor und erstellen Sie eine C-Programmdatei mit dem Namen mstest.c mit folgendem Inhalt:

#include "stdio.h"
#include <mediastreamer2/mscommon.h>
int main()
{
  ms_init();
  printf ("Mediastreamer is ready.n");
}

Er initialisiert den Mediastreamer, gibt eine Begrüßung aus und beendet die Ausführung.

Speichern Sie die Datei und kompilieren Sie die Testanwendung mit dem Befehl:

$ gcc mstest.c -o mstest `pkg-config mediastreamer --libs --cflags`

Beachten Sie, dass die Zeile

`pkg-config mediastreamer --libs --cflags`

in Anführungszeichen steht, die sich auf der Tastatur dort befindet, wo auch der Buchstabe „Ё“ zu finden ist.

Wenn die Datei fehlerfrei ist, wird nach der Kompilierung eine Datei im Verzeichnis erscheinen, die mstestheißt. Führen Sie das Programm aus:

$ ./mstest

Das Ergebnis wird wie folgt aussehen:

ALSA lib conf.c:4738:(snd_config_expand) Unbekannte Parameter 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Ungültiger CTL default:0
ortp-Warnung-Konnte Mixer nicht mit Karte verbinden: Ungültiges Argument
ALSA lib conf.c:4738:(snd_config_expand) Unbekannte Parameter 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unbekannte PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Unbekannte Parameter 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unbekannte PCM default:0
ortp-Warnung-Merkwürdig, der Soundkarte HDA Intel PCH scheint nichts zu können, versuche es mit plughw erneut...
Mediastreamer ist bereit.

In diesem Listing sehen wir Fehlermeldungen, die von der ALSA-Bibliothek ausgegeben werden, die zur Steuerung der Soundkarte verwendet wird. Die Entwickler des Media Streamers halten dies für normal. In diesem Fall müssen wir uns ihnen anschließen.

Jetzt sind wir bereit, mit dem Media Streamer zu arbeiten. Wir haben die Media Streamer-Bibliothek und das Kompilierungswerkzeug installiert und mit einer Testanwendung überprüft, dass die Werkzeuge konfiguriert sind und der Media Streamer erfolgreich initialisiert wird.

Im nächsten Artikel Wir werden eine Anwendung erstellen, die das Audio-Signal in einer Kette aus mehreren Filtern sammelt und verarbeitet.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster