Entdecken Sie die VoIP-Engine von Mediastreamer2. Teil 1

Das Material des Artikels stammt von mir Zen-Kanal.

Einführung

Dieser Artikel ist der Beginn einer Reihe von Artikeln über die Echtzeit-Medienverarbeitung mithilfe der Mediastreamer2-Engine. Die Präsentation umfasst die Mindestkenntnisse der Arbeit im Linux-Terminal und der Programmierung in der Sprache C.

Mediastreamer2 ist die VoIP-Engine hinter dem beliebten Open-Source-Software-VoIP-Telefonprojekt. Linphone. In Linphone implementiert Mediastreamer2 alle Funktionen rund um Ton und Video. Eine detaillierte Liste der Engine-Funktionen finden Sie auf dieser Mediastreamer-Seite. Der Quellcode ist hier: Gitlab.

Im weiteren Verlauf des Textes verwenden wir der Einfachheit halber anstelle des Wortes Mediastreamer2 die russische Schreibweise: „Media Streamer“.

Die Entstehungsgeschichte ist nicht ganz klar, aber dem Quellcode nach zu urteilen, nutzte es zuvor die Bibliothek glatt, was sozusagen auf eine mögliche entfernte Beziehung mit hindeutet GStreamer. Im Vergleich dazu wirkt der Media-Streamer leichter. Die erste Version von Linphone erschien im Jahr 2001, sodass der Media-Streamer derzeit seit fast 20 Jahren existiert und weiterentwickelt wird.

Das Herzstück des Media Streamers ist eine Architektur namens „Data Flow“ (Datenfluss). Ein Beispiel für eine solche Architektur ist in der folgenden Abbildung dargestellt.

Entdecken Sie die VoIP-Engine von Mediastreamer2. Teil 1

In dieser Architektur wird der Datenverarbeitungsalgorithmus nicht durch einen Programmcode, sondern durch ein Schema (Graph) zum Verbinden von Funktionen spezifiziert, die in beliebiger Reihenfolge angeordnet werden können. Diese Funktionen werden Filter genannt.

Diese Architektur ermöglicht die Implementierung der Medienverarbeitungsfunktionalität in Form einer Reihe von Filtern, die mit dem RTP-Verkehrsverarbeitungs- und Übertragungsschema des VoIP-Telefons verbunden sind.

Die Möglichkeit, Filter zu beliebigen Schemata zu kombinieren, die einfache Entwicklung neuer Filter und die Implementierung des Media Streamers als unabhängige separate Bibliothek ermöglichen die Verwendung in anderen Projekten. Darüber hinaus kann das Projekt im VoIP-Bereich angesiedelt werden, da die Möglichkeit besteht, selbst erstellte Filter hinzuzufügen.

Die standardmäßig mitgelieferte Filterbibliothek ist recht umfangreich und kann, wie bereits erwähnt, mit Filtern unseres eigenen Designs erweitert werden. Doch zunächst beschreiben wir die vorgefertigten Filter, die dem Media-Streamer beiliegen. Hier ist ihre Liste:

Schallfilter

Audioaufnahme und -wiedergabe

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Nativer Android-Sound (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Audio-Warteschlangendienst (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Audio Unit-Dienst (Mac OS X)
  • Künste (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Dateiplayer (RAW-/WAV-/PCAP-Dateien) (Linux): MS_FILE_PLAYER
  • Dateiplayer (RAW-/WAV-Dateien) (Windows): MS_WINSND_READ
  • In Datei schreiben (WAV-Dateien) (Linux): MS_FILE_REC
  • In Datei schreiben (WAV-Dateien) (Windows): MS_WINSND_WRITE
  • Mac-Audioeinheit (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)

Audiokodierung/-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
  • Lineares PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Audioverarbeitung

  • Kanalkonvertierung (Mono->Stereo, Stereo->Mono): MS_CHANNEL_ADAPTER
  • Konferenz: MS_CONF
  • DTMF-Generator: MS_DTMF_GEN
  • Echounterdrückung (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mixer: MS_MIXER
  • Paketverlustkompensator (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Tondetektor: MS_TONE_DETECTOR
  • Lautstärkeregelung und Signalpegelmessung: MS_VOLUME

Videofilter

Videoaufnahme und -wiedergabe

  • Android-Erfassung
  • Android-Wiedergabe
  • AV Foundation-Erfassung (iOS)
  • AV Foundation-Wiedergabe (iOS)
  • DirectShow Capture (Windows)
  • DrawDib-Wiedergabe (Windows)
  • Externe Wiedergabe – Video an die oberste Ebene senden
  • GLX-Wiedergabe (Linux): MS_GLXVIDEO
  • Mire – Synthetisches Bewegtbild: MS_MIRE
  • OpenGL-Wiedergabe (Mac OS X)
  • OpenGL ES2-Wiedergabe (Android)
  • Quicktime Capture (Mac OS X)
  • SDL-Wiedergabe: MS_SDL_OUT
  • Statische Bildausgabe: MS_STATIC_IMAGE
  • Video für Linux (V4L)-Erfassung (Linux): MS_V4L
  • Video für Linux 2 (V4L2) Capture (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow)-Aufnahme (Windows)
  • Video4windows (DirectShow)-Aufnahme (Windows CE)
  • Video für Windows (vfw) erfassen (Windows)
  • XV-Wiedergabe (Linux)

Videokodierung/-dekodierung

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Schnee: 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-Schnappschuss
  • Pixelformatkonverter: MS_PIX_CONV
  • Resizer
  • Andere Filter
  • Austausch von Datenblöcken zwischen Threads: MS_ITC_SOURCE, MS_ITC_SINK
  • Sammeln von Datenblöcken aus mehreren Eingaben zu einer einzelnen Ausgabe: MS_JOIN
  • RTP-Empfangen/Senden: MS_RTP_SEND, MS_RTP_RECV
  • Eingabedaten in mehrere Ausgaben kopieren: MS_TEE
  • Beendeter Ladevorgang: MS_VOID_SINK
  • Stillequelle: MS_VOID_SOURCE

Plugins

Schallfilter

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

    Videofilter

  • H.264-Software-Encoder
  • H.264 V4L2 Hardware-beschleunigter Encoder/Decoder

Nach einer kurzen Beschreibung des Filters wird der Name des Typs angezeigt, der beim Erstellen einer neuen Instanz dieses Filters verwendet wird. Im Folgenden beziehen wir uns auf diese Liste.

Installation unter Linux Ubuntu

Jetzt installieren wir den Media Streamer auf dem Computer und erstellen damit unsere erste Anwendung.

Für die Installation von Mediastremer2 auf einem Computer oder einer virtuellen Maschine mit Ubuntu sind keine besonderen Kenntnisse erforderlich. Hier und im Folgenden bezeichnet das Symbol „$“ den Shell-Prompt zur Eingabe von Befehlen. Diese. Wenn Sie in der Auflistung dieses Symbol am Anfang der Zeile sehen, dann ist dies die Zeile, in der Befehle angezeigt werden, die im Terminal ausgeführt werden sollen.

Es wird davon ausgegangen, dass Ihr Computer während der Schritte in diesem Artikel Zugriff auf das Internet hat.

Installieren des libmediastremer-dev-Pakets

Starten Sie das Terminal und geben Sie den Befehl ein:

$ sudo apt-get update

Sie werden nach einem Passwort gefragt, um Änderungen vorzunehmen. Geben Sie es ein und der Paketmanager aktualisiert seine Datenbanken. Danach müssen Sie Folgendes ausführen:

$ sudo apt-get install libmediastreamer-dev

Die erforderlichen Abhängigkeitspakete und die Media-Streamer-Bibliothek selbst werden automatisch heruntergeladen und installiert.

Die Gesamtgröße der heruntergeladenen Abhängigkeits-Deb-Pakete beträgt etwa 35 MB. Details zum installierten Paket finden Sie mit dem Befehl:

$ dpkg -s libmediastreamer-dev

Antwortbeispiel:

Package: libmediastreamer-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 244
Maintainer: Ubuntu Developers <[email protected]>
Architecture: amd64
Source: linphone
Version: 3.6.1-2.5
Depends: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Description: Linphone web phone's media library - development files
Linphone is an audio and video internet phone using the SIP protocol. It
has a GTK+ and console interface, includes a large variety of audio and video
codecs, and provides IM features.
.
This package contains the development libraries for handling media operations.
Original-Maintainer: Debian VoIP Team <[email protected]>
Homepage: http://www.linphone.org/

Entwicklungstools installieren

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

$ sudo apt-get install gcc

Wir überprüfen das Ergebnis, indem wir die Compilerversion abfragen:

$ gcc --version

Die Antwort sollte etwa so lauten:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Erstellen und Ausführen der Testanwendung

Wir schaffen in home Ordner für unsere Tutorial-Projekte, nennen wir ihn 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 initialisiert den Medienstreamer, druckt eine Begrüßung und wird beendet.

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 eingeschlossen, die sich auf der Tastatur an derselben Stelle befinden wie der Buchstabe „Ё“.

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

$ ./mstest

Das Ergebnis wird so aussehen:

ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Invalid CTL default:0
ortp-warning-Could not attach mixer to card: Invalid argument
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ortp-warning-Strange, sound card HDA Intel PCH does not seems to be capable of anything, retrying with plughw...
Mediastreamer is ready.

In dieser Auflistung sehen wir die Fehlermeldungen, die die ALSA-Bibliothek anzeigt, sie wird zur Steuerung der Soundkarte verwendet. Die Entwickler des Medienstreamers selbst halten das für normal. In diesem Fall stimmen wir ihnen widerwillig zu.

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

Nächste Artikel Wir werden eine Anwendung erstellen, die die Verarbeitung eines Audiosignals in einer Kette mehrerer Filter zusammenstellt und ausführt.

Source: habr.com