Exploration du moteur VoIP Mediastreamer2. Partie 1

Le matériel de l'article est tiré de mon canal zen.

introduction

Cet article est le début d'une série d'articles sur le traitement multimédia en temps réel à l'aide du moteur Mediastreamer2. La présentation impliquera les compétences minimales de travail dans le terminal Linux et la programmation en langage C.

Mediastreamer2 est le moteur VoIP derrière le projet populaire de téléphone VoIP logiciel open source. linphone. Dans Linphone Mediastreamer2 implémente toutes les fonctions liées au son et à la vidéo. Une liste détaillée des fonctionnalités du moteur peut être consultée sur cette page Mediastreamer. Le code source est ici : gitlab ce.

Plus loin dans le texte, par commodité, au lieu du mot Mediastreamer2 nous utiliserons sa notation russe : « media streamer ».

L'historique de sa création n'est pas tout à fait clair, mais à en juger par son code source, il utilisait auparavant la bibliothèque Désinvolte, qui, pour ainsi dire, fait allusion à une éventuelle relation distante avec GStreamer. En comparaison, le streamer multimédia semble plus léger. La première version de Linphone est apparue en 2001, donc pour le moment le streamer multimédia existe et se développe depuis près de 20 ans.

Au cœur du media streamer se trouve une architecture appelée « Data flow » (flux de données). Un exemple d'une telle architecture est illustré dans la figure ci-dessous.

Exploration du moteur VoIP Mediastreamer2. Partie 1

Dans cette architecture, l'algorithme de traitement des données n'est pas spécifié par un code de programme, mais par un schéma (graphe) de fonctions de connexion pouvant être organisées dans n'importe quel ordre. Ces fonctions sont appelées filtres.

Cette architecture permet de mettre en œuvre la fonctionnalité de traitement multimédia sous la forme d'un ensemble de filtres connectés au schéma de traitement et de transmission du trafic RTP du téléphone VoIP.

La possibilité de combiner des filtres dans des schémas arbitraires, le développement simple de nouveaux filtres, la mise en œuvre du streamer multimédia en tant que bibliothèque séparée indépendante, lui permettent d'être utilisé dans d'autres projets. De plus, le projet peut se situer dans le domaine de la VoIP, puisqu'il est possible d'ajouter des filtres réalisés par soi-même.

La bibliothèque de filtres fournie par défaut est assez riche et, comme déjà mentionné, peut être étendue avec des filtres de notre propre conception. Mais d'abord, décrivons les filtres prêts à l'emploi fournis avec le diffuseur multimédia. Voici leur liste :

Filtres sonores

Capture et lecture audio

  • Alsa (Linux) : MS_ALSA_WRITE, MS_ALSA_READ
  • Son natif Android (libmedia) : MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Service de file d'attente audio (Mac OS X) : MS_AQ_WRITE, MS_AQ_READ
  • Service d'unité audio (Mac OS X)
  • Arts (Linux) : MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows) : MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Lecteur de fichiers (fichiers raw/wav/pcap) (Linux) : MS_FILE_PLAYER
  • Lecteur de fichiers (fichiers raw/wav) (Windows) : MS_WINSND_READ
  • Écrire dans un fichier (fichiers wav) (Linux) : MS_FILE_REC
  • Écrire dans un fichier (fichiers wav) (Windows) : MS_WINSND_WRITE
  • Unité audio Mac (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
  • Son Windows (Windows)

Encodage/décodage audio

  • G.711 loi a : MS_ALAW_DEC, MS_ALAW_ENC
  • Loi µ G.711 : 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
  • PCM linéaire : MS_L16_ENC, MS_L16_DEC
  • Langue : MS_SPEEX_ENC, MS_SPEEX_DEC

Traitement du son

  • Conversion de canal (mono->stéréo, stéréo->mono) : MS_CHANNEL_ADAPTER
  • Conférence : MS_CONF
  • Générateur DTMF : MS_DTMF_GEN
  • Annulation d'écho (speex): MS_SPEEX_EC
  • Égaliseur : MS_EQUALIZER
  • Mélangeur : MS_MIXER
  • Compensateur de perte de paquets (PLC) : MS_GENERIC_PLC
  • Rééchantillonneur : MS_RESAMPLE
  • Détecteur de tonalité : MS_TONE_DETECTOR
  • Contrôle du volume et mesure du niveau du signal : MS_VOLUME

Filtres vidéo

Capture et lecture vidéo

  • capture androïde
  • lecture Android
  • Capture AV Foundation (iOS)
  • Lecture AV Foundation (iOS)
  • Capture DirectShow (Windows)
  • Lecture DrawDib (Windows)
  • Lecture externe - Envoi de la vidéo à la couche supérieure
  • Lecture GLX (Linux) : MS_GLXVIDEO
  • Mire - Image animée synthétique : MS_MIRE
  • Lecture OpenGL (Mac OS X)
  • Lecture OpenGL ES2 (Android)
  • Capture Quicktime (Mac OS X)
  • Lecture SDL : MS_SDL_OUT
  • Sortie d'image statique : MS_STATIC_IMAGE
  • Capture vidéo pour Linux (V4L) (Linux) : MS_V4L
  • Capture vidéo pour Linux 2 (V4L2) (Linux) : MS_V4L2_CAPTURE
  • Capture Video4windows (DirectShow) (Windows)
  • Capture Video4windows (DirectShow) (Windows CE)
  • Capture vidéo pour Windows (vfw) (Windows)
  • Lecture XV (Linux)

Encodage/décodage vidéo

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Neige : MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (décodeur uniquement) : MS_H264_DEC
  • Théorique : MS_THEORA_ENC, MS_THEORA_DEC
  • VP8 : MS_VP8_ENC, MS_VP8_DEC

Traitement vidéo

  • instantané jpeg
  • Convertisseur de format de pixel : MS_PIX_CONV
  • Redimensionner
  • Autres filtres
  • Echange de blocs de données entre threads : MS_ITC_SOURCE, MS_ITC_SINK
  • Collecte de blocs de données de plusieurs entrées vers une seule sortie : MS_JOIN
  • Réception/transmission RTP : MS_RTP_SEND, MS_RTP_RECV
  • Copie des données d'entrée vers plusieurs sorties : MS_TEE
  • Charge terminée : MS_VOID_SINK
  • Source des silences : MS_VOID_SOURCE

plugins

Filtres sonores

  • Encodeur/décodeur AMR-NB
  • Codeur/décodeur G.729
  • Encodeur/décodeur iLBC
  • Encodeur/décodeur SILK

    Filtres vidéo

  • Encodeur logiciel H.264
  • Encodeur/décodeur à accélération matérielle H.264 V4L2

Après une brève description du filtre, le nom du type est affiché, qui est utilisé lors de la création d'une nouvelle instance de ce filtre. Dans ce qui suit, nous nous référerons à cette liste.

Installation sous Linux Ubuntu

Nous allons maintenant installer le diffuseur multimédia sur l'ordinateur et créer notre première application avec.

L'installation de Mediastremer2 sur un ordinateur ou une machine virtuelle exécutant Ubuntu ne nécessite aucune compétence particulière. Ici et ci-dessous, le symbole "$" indiquera l'invite du shell pour entrer des commandes. Ceux. si dans la liste vous voyez ce symbole au début de la ligne, il s'agit de la ligne dans laquelle les commandes sont affichées pour être exécutées dans le terminal.

Il est supposé que pendant les étapes de cet article, votre ordinateur a accès à Internet.

Installation du paquet libmediastremer-dev

Lancez le terminal et tapez la commande :

$ sudo apt-get update

Un mot de passe vous sera demandé pour apporter des modifications, entrez-le et le gestionnaire de paquets mettra à jour ses bases de données. Après cela, vous devez exécuter :

$ sudo apt-get install libmediastreamer-dev

Les packages de dépendance nécessaires et la bibliothèque de diffusion multimédia elle-même seront automatiquement téléchargés et installés.

La taille totale des packages deb de dépendance téléchargés sera d'environ 35 Mo. Les détails sur le package installé peuvent être trouvés avec la commande :

$ dpkg -s libmediastreamer-dev

Exemple de réponse :

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/

Installation des outils de développement

Installez le compilateur C et ses outils d'accompagnement :

$ sudo apt-get install gcc

Nous vérifions le résultat en interrogeant la version du compilateur :

$ gcc --version

La réponse devrait être quelque chose comme ceci:

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.

Création et exécution de l'application d'essai

Nous créons en foyer dossier pour nos projets de tutoriel, appelons-le mtutoriel:

$ mkdir ~/mstutorial

Utilisez votre éditeur de texte préféré et créez un fichier de programme C appelé mstest.c avec le contenu suivant:

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

Il initialise le diffuseur multimédia, imprime un message d'accueil et quitte.

Enregistrez le fichier et compilez l'application de test avec la commande :

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

Notez que la ligne

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

entre guillemets, qui sont situés sur le clavier au même endroit que la lettre "Ё".

Si le fichier ne contient pas d'erreurs, alors après compilation un fichier apparaîtra dans le répertoire test de test. Nous commençons le programme :

$ ./mstest

Le résultat sera comme ceci :

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.

Dans cette liste, nous voyons les messages d'erreur que la bibliothèque ALSA affiche, elle est utilisée pour contrôler la carte son. Les développeurs du streamer multimédia eux-mêmes pensent que c'est normal. Dans ce cas, nous sommes d'accord avec eux à contrecœur.

Nous sommes maintenant prêts à travailler avec le diffuseur multimédia. Nous avons installé la bibliothèque de diffusion multimédia, l'outil de compilation et, à l'aide d'une application d'essai, vérifié que les outils sont configurés et que la diffusion multimédia s'initialise avec succès.

Suivant article nous allons créer une application qui va assembler et exécuter le traitement d'un signal audio dans une chaîne de plusieurs filtres.

Source: habr.com