Das Material des Artikels stammt von mir
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.
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
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.
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
Source: habr.com