Studieren des VoIP-Engines Mediastreamer2. Teil 1

Der Artikelinhalt stammt von meinem Zen-Kanal.

Einführung

Dieser Artikel ist der Beginn einer Artikelreihe über die Echtzeitverarbeitung von Mediendaten mit der Mediastreamer2-Engine. Im Verlauf der Darstellung werden minimale Kenntnisse in der Arbeit mit dem Linux-Terminal und Programmierung in C eingesetzt.

Mediastreamer2 ist eine VoIP-Engine, die dem beliebten Open-Source-Projekt einer VoIP-Telefonsoftware zugrunde liegt. Linphone. In Linphone implementiert Mediastreamer2 alle Funktionen, die mit Audio und Video zusammenhängen. Eine ausführliche 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 dessen russische Bezeichnung: „медиастример“ verwenden.

Die Entstehungsgeschichte ist nicht ganz klar, aber judging by its source code, it previously used the library Glib, was auf eine mögliche entfernte Verwandtschaft mit GStreamerhindeutet. Im Vergleich dazu wirkt der Mediastreamer leichter. Die erste Version von Linphone erschien im Jahr 2001, sodass der Mediastreamer nun seit fast 20 Jahren existiert und sich weiterentwickelt.

Dem Mediastreamer liegt eine Architektur zugrunde, die als „Data flow“ (Datenfluss) bezeichnet wird. Ein Beispiel für eine solche Architektur ist im nachstehenden Bild dargestellt.

Studieren des VoIP-Engines Mediastreamer2. Teil 1

In dieser Architektur wird der Algorithmus zur Datenverarbeitung nicht durch Code, sondern durch ein Diagramm (Graf) der Verbindung von Funktionen definiert, die in beliebiger Reihenfolge angeordnet werden können. Diese Funktionen werden Filter genannt.

Eine solche Architektur ermöglicht es, die Funktionalität der Medienverarbeitung in Form einer Reihe von Filtern zu realisieren, die in einem Verarbeitungs- und Übertragungsschema für RTP-Verkehr eines VoIP-Telefons verbunden sind.

Die Möglichkeit, Filter in beliebigen Schemen zu verbinden, die einfache Entwicklung neuer Filter und die Realisierung des Mediastreamers als eigenständige Bibliothek ermöglichen es, ihn auch in anderen Projekten zu verwenden. Dabei kann das Projekt im Bereich VoIP liegen, da die Möglichkeit besteht, selbstgebaute Filter hinzuzufügen.

Die standardmäßig bereitgestellte Filterbibliothek ist recht umfangreich und kann, wie bereits erwähnt, durch selbst entwickelte Filter ergänzt werden. Zunächst möchten wir jedoch die fertigen Filter beschreiben, die zusammen mit dem Mediastreamer geliefert werden. Hier ist deren Liste:

Audiofilter

Aufzeichnung und Wiedergabe von Ton

  • 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)
  • Arts (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Datei-Player (raw/wav/pcap Dateien) (Linux): MS_FILE_PLAYER
  • Datei-Player (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)

Kodierung/Dekodierung von Audio

  • 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

  • Kanalanpassung (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferenz: MS_CONF
  • DTMF-Generator: MS_DTMF_GEN
  • Hallunterdrückung (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mixer: MS_MIXER
  • Paketverlustkompensation (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Tondetektor: MS_TONE_DETECTOR
  • Lautstärkeregelung und Pegelmessung: MS_VOLUME

Video-Filter

Videoaufzeichnung und -wiedergabe

  • Android-Aufzeichnung
  • Android-Wiedergabe
  • AV Foundation Aufzeichnung (iOS)
  • AV Foundation Wiedergabe (iOS)
  • DirectShow Aufzeichnung (Windows)
  • DrawDib Wiedergabe (Windows)
  • Externe Wiedergabe – Video an oberste Ebene senden
  • GLX Wiedergabe (Linux): MS_GLXVIDEO
  • Mire – Synthesebild: MS_MIRE
  • OpenGL Wiedergabe (Mac OS X)
  • OpenGL ES2 Wiedergabe (Android)
  • Quicktime Aufzeichnung (Mac OS X)
  • SDL Wiedergabe: MS_SDL_OUT
  • Ausgabe statischer Bilder: MS_STATIC_IMAGE
  • Video für Linux (V4L) Aufzeichnung (Linux): MS_V4L
  • Video für Linux 2 (V4L2) Aufzeichnung (Linux): MS_V4L2_CAPTURE
  • Video4Windows (DirectShow) Aufzeichnung (Windows)
  • Video4Windows (DirectShow) Aufzeichnung (Windows CE)
  • Video für Windows (vfw) Aufzeichnung (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 Dekoder): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Videoverarbeitung

  • JPEG Snapshot
  • Pixelformat-Konverter: MS_PIX_CONV
  • Resizer
  • Weitere Filter
  • Datenblockaustausch zwischen Threads: MS_ITC_SOURCE, MS_ITC_SINK
  • Datenblockzusammenführung von mehreren Eingängen zu einem Ausgang: MS_JOIN
  • RTP Empfang/Übertragung: MS_RTP_SEND, MS_RTP_RECV
  • Eingabedaten an mehrere Ausgänge kopieren: MS_TEE
  • Kohärente Ladung: MS_VOID_SINK
  • Stille Quelle: MS_VOID_SOURCE

Plugins

Audiofilter

  • AMR-NB Kodierer/Dekodierer
  • G.729 Kodierer/Dekodierer
  • iLBC Kodierer/Dekodierer
  • SILK Kodierer/Dekodierer

    Video-Filter

  • H.264 Software-Kodierer
  • H.264 V4L2 Kodierer/Dekodierer mit Hardwarebeschleunigung

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

Installation unter Linux Ubuntu

Nun werden wir den Mediastrimmer auf den Computer installieren und unsere erste Anwendung damit erstellen.

Die Installation des Mediastreamers2 auf einem Computer oder einer virtuellen Maschine unter Ubuntu erfordert keine besonderen Fähigkeiten. Hier und im Folgenden werden wir das Symbol „$“ verwenden, um die Eingabeaufforderung der Shell für die Eingabe von Befehlen zu kennzeichnen. Das heißt, wenn Sie in der Auflistung dieses Symbol zu Beginn einer Zeile sehen, bedeutet dies, dass es sich um eine Zeile handelt, in der die Befehle für die Ausführung im Terminal gezeigt werden.

Es wird vorausgesetzt, dass Ihr Computer während der Durchführung der in diesem Artikel beschriebenen Aktionen Zugriff auf das 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 die Änderung gefragt, geben Sie es ein, und der Paketmanager wird seine Datenbanken aktualisieren. Anschließend müssen Sie Folgendes ausführen:

$ sudo apt-get install libmediastreamer-dev

Notwendige Abhängigkeitspakete und die Mediastrimmer-Bibliothek werden automatisch heruntergeladen und installiert.

Die Gesamtdatenmenge der heruntergeladenen deb-Pakete für Abhängigkeiten beträgt etwa 35 MB. Die Details zum installierten Paket können mit dem Befehl abgefragt werden:

$ dpkg -s libmediastreamer-dev

Beispielantwort:

Package: libmediastreamer-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 244
Maintainer: Ubuntu Developers 
Architecture: amd64
Source: linphone
Version: 3.6.1-2.5
Depends: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Description: Linphone-Webphone-Medienbibliothek - Entwicklungsdateien
Linphone ist ein Audio- und Video-Internettelefon, das das SIP-Protokoll verwendet. Es
hat eine GTK+- und Konsolenschnittstelle, bietet eine große Auswahl an Audio- und Video-Codecs und umfasst IM-Funktionen.
.
Dieses Paket enthält die Entwicklungsbibliotheken für die Verarbeitung von Mediendaten.
Original-Maintainer: Debian VoIP Team 
Homepage: http://www.linphone.org/

Installation der Entwicklungstools

Installieren Sie den C-Compiler und die zugehörigen Werkzeuge:

$ sudo apt-get install gcc

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

$ 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 kostenlose Software; siehe die Quelle für die Kopierbedingungen. Es gibt keine
Garantie; nicht einmal für die MARKTGÄNGIGKEIT oder FITNESS FÜR EINEN BESTIMMTEN ZWECK.

Bau und Ausführung einer Testanwendung

Erstellen Sie in home einen Ordner für unsere Lernprojekte, den wir mstutorial:

$ mkdir ~/mstutorial

Verwenden 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");
}

Es führt die Initialisierung des Mediastrimmers durch, gibt eine Begrüßung aus und beendet die Ausführung.

Wir speichern die Datei und kompilieren die Testanwendung mit dem Befehl:

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

Bitte beachten Sie, dass die Zeile

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

eingeschlossen in Anführungszeichen, die sich auf der Tastatur an derselben Stelle wie der Buchstabe „Ё“ befinden.

Wenn die Datei keine Fehler enthält, wird nach der Kompilierung im Verzeichnis die Datei mstesterzeugt. Wir starten das Programm:

$ ./mstest

Das Ergebnis wird wie folgt sein:

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-warning-Konnte Mixer nicht an Karte anhängen: 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-warning-Es scheint, dass die Soundkarte HDA Intel PCH nichts kann, es wird mit plughw neu versucht...
Mediastreamer ist bereit.

In dieser Auflistung sehen wir Fehlermeldungen, die von der ALSA-Bibliothek ausgegeben werden, die zur Steuerung der Soundkarte verwendet wird. Die Entwickler des Mediastreamers halten das für normal. In diesem Fall müssen wir ihnen zustimmen.

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

Im nächsten Artikel Wir werden eine Anwendung erstellen, die die Verarbeitung des Audiosignals in einer Kette aus mehreren Filtern implementiert.

Quelle: habr.com

60GB SSD 8Gb DDR4