Explorons le moteur VoIP Mediastreamer2. Partie 1

Le contenu de cet article est tiré de ma chaîne Zen.

Introduction

Cet article est le début d'une série sur le traitement en temps réel des données multimédias à l'aide du moteur Mediastreamer2. Dans le cours de l'exposé, des compétences minimales en terminal Linux et en programmation en langage C seront nécessaires.

Mediastreamer2 est un moteur VoIP qui constitue la base du projet open-source populaire de téléphone VoIP. Linphone. Dans Linphone, Mediastreamer2 implémente toutes les fonctionnalités liées au son et à la vidéo. La liste détaillée des capacités du moteur se trouve sur cette page Mediastreamer. Le code source est disponible ici : GitLab.

Par la suite, dans le texte, pour plus de commodité, nous utiliserons la notation russe du mot Mediastreamer2 : « медиастример ».

L'histoire de sa création n'est pas tout à fait claire, mais à en juger par son code source, il utilisait auparavant la bibliothèque Glib, ce qui sous-entend une possible parenté lointaine avec GStreamer. Comparé à lui, le медиастример semble plus léger. La première version de Linphone est apparue en 2001, de sorte qu'à présent, le медиастример existe et se développe depuis presque 20 ans.

À la base du медиастримера se trouve une architecture appelée « Data flow » (flux de données). Un exemple de cette architecture est illustré dans l'image ci-dessous.

Explorons le moteur VoIP Mediastreamer2. Partie 1

Dans cette architecture, l'algorithme de traitement des données est défini non pas par du code, mais par un schéma (graphe) de connexion de fonctions qui peuvent être agencées dans n'importe quel ordre. Ces fonctions sont appelées filtres.

Cette architecture permet de réaliser des fonctionnalités de traitement multimédia sous la forme d'un ensemble de filtres connectés dans un schéma de traitement et de transmission du trafic RTP d'un téléphone VoIP.

La possibilité de connecter des filtres dans des schémas arbitraires, la facilité de développement de nouveaux filtres et la mise en œuvre du медиастримера en tant que bibliothèque autonome permettent de l'utiliser également dans d'autres projets. De plus, le projet peut se situer dans le domaine du VoIP, car il est possible d'ajouter des filtres conçus par ses propres soins.

La bibliothèque de filtres fournie par défaut est assez riche et, comme déjà mentionné, peut être étendue avec des filtres développés soi-même. Mais d'abord, décrivons les filtres prêts à l'emploi qui sont fournis avec le медиастример. Voici leur liste :

Filtres sonores

Capture et reproduction du son

  • 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és audio (Mac OS X)
  • Arts (Linux) : MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Lecteur de fichiers (raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Lecteur de fichiers (raw/wav) (Windows): MS_WINSND_READ
  • Enregistrement dans un fichier (wav) (Linux): MS_FILE_REC
  • Enregistrement dans un fichier (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)

Codage/décodage audio

  • G.711 a-loi: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-loi: 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
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Traitement audio

  • Adaptateur de canal (mono->stéréo, stéréo->mono): MS_CHANNEL_ADAPTER
  • Conférence: MS_CONF
  • Générateur DTMF: MS_DTMF_GEN
  • Suppression d'écho (speex): MS_SPEEX_EC
  • Égaliseur: MS_EQUALIZER
  • Mixeur: 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 de signal: MS_VOLUME

Filtres vidéo

Capture et lecture vidéo

  • Capture Android
  • Lecture Android
  • Capture AV Foundation (iOS)
  • Lecture AV Foundation (iOS)
  • Capture DirectShow (Windows)
  • Lecture DrawDib (Windows)
  • Lecture externe — Envoi vidéo au niveau supérieur
  • Lecture GLX (Linux): MS_GLXVIDEO
  • Mire — Image en mouvement 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'images statiques: MS_STATIC_IMAGE
  • Capture Video For Linux (V4L) (Linux): MS_V4L
  • Capture Video For Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Capture Video4windows (DirectShow) (Windows)
  • Capture Video4windows (DirectShow) (Windows CE)
  • Capture Video For Windows (vfw) (Windows)
  • Lecture XV (Linux)

Codage/Décodage vidéo

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

Traitement vidéo

  • Instantané JPEG
  • Convertisseur de format pixel: MS_PIX_CONV
  • Redimensionneur
  • Autres filtres
  • Échange de blocs de données entre threads: MS_ITC_SOURCE, MS_ITC_SINK
  • Assemblage de blocs de données à partir de plusieurs entrées vers une sortie: MS_JOIN
  • Transmission/ réception RTP: MS_RTP_SEND, MS_RTP_RECV
  • Duplication des entrées sur plusieurs sorties: MS_TEE
  • Charge cohérente: MS_VOID_SINK
  • Source de silence: MS_VOID_SOURCE

Plugins

Filtres sonores

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

    Filtres vidéo

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

Après une brève description du filtre, le nom du type utilisé pour créer une nouvelle instance de ce filtre est affiché. Dans la suite de cet exposé, nous ferons référence à cette liste.

Installation sur Linux Ubuntu

Nous allons maintenant procéder à l'installation du médiastreamer sur l'ordinateur et créer notre première application avec.

L'installation de Mediastremer2 sur un ordinateur ou une machine virtuelle sous Ubuntu ne nécessite pas de compétences particulières. Ici et ailleurs, le symbole « $ » désignera l'invite de la console shell pour entrer des commandes. Donc, si vous voyez ce symbole au début d'une ligne, cela signifie que c'est une ligne où sont affichées les commandes à exécuter dans le terminal.

Il est supposé qu'au cours des actions décrites dans cet article, votre ordinateur a accès à Internet.

Installation du paquet libmediastremer-dev

Nous ouvrons le terminal et saisissons la commande :

$ sudo apt-get update

Un mot de passe pour effectuer des modifications sera demandé, saisissez-le et le gestionnaire de paquets mettra à jour ses bases. Ensuite, il faut exécuter :

$ sudo apt-get install libmediastreamer-dev

Les paquets de dépendances nécessaires et la bibliothèque médiastreamer elle-même seront automatiquement téléchargés et installés.

La taille totale des paquets .deb de dépendances téléchargés sera d'environ 35 Mo. Vous pouvez obtenir des détails sur le paquet installé en utilisant la commande :

$ dpkg -s libmediastreamer-dev

Exemple de réponse :

Paquet : libmediastreamer-dev
Statut : install ok installed
Priorité : optionnel
Section : libdevel
Taille installée : 244
Mainteneur : Développeurs Ubuntu 
Architecture : amd64
Source : linphone
Version : 3.6.1-2.5
Dépend : libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Description : Bibliothèque multimédia du téléphone web Linphone - fichiers de développement
Linphone est un téléphone internet audio et vidéo utilisant le protocole SIP. Il dispose d'une interface GTK+ et console, inclut une large variété de codecs audio et vidéo, et fournit des fonctionnalités de messagerie instantanée.
.
Ce paquet contient les bibliothèques de développement pour la gestion des opérations multimédia.
Mainteneur d'origine : Équipe VoIP de Debian 
Page d'accueil : http://www.linphone.org/

Installation des outils de développement

Nous installons le compilateur C et les outils associés :

$ sudo apt-get install gcc

Vérifions le résultat en demandant la version du compilateur :

$ gcc --version

La réponse devrait être à peu près de cette façon :

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Ce logiciel est libre ; consultez la source pour les conditions de copie.  Il n'y a AUCUNE
garantie ; pas même pour COMMERCIALISATION ou ADÉQUATION À UN USAGE PARTICULIER.

Compilation et exécution d'une application test

Créons dans home un dossier pour nos projets d'apprentissage, appelons-le mstutorial:

$ mkdir ~/mstutorial

Utilisez votre éditeur de texte préféré et créez un fichier de programme C nommé 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 médiastreamer, imprime un message de bienvenue et termine l'exécution.

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

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

Veuillez noter que la ligne

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

est entourée de guillemets, qui se trouvent sur le clavier là où se trouve aussi la lettre «Ё».

Si le fichier ne contient pas d'erreurs, un fichier mstestapparaîtra dans le répertoire après la compilation :

$ .\/mstest

Le résultat sera le suivant :

ALSA lib conf.c:4738:(snd_config_expand) Paramètres inconnus 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) CTL par défaut invalide:0
ortp-warning-Could not attach mixer to card: Invalid argument
ALSA lib conf.c:4738:(snd_config_expand) Paramètres inconnus 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM inconnu par défaut:0
ALSA lib conf.c:4738:(snd_config_expand) Paramètres inconnus 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM inconnu par défaut: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 générés par la bibliothèque ALSA, qui est utilisée pour gérer la carte son. Les développeurs de Mediastreamer considèrent que c'est normal. Dans ce cas, nous serons d'accord avec eux à contrecœur.

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

Dans la prochaine article nous allons créer une application qui assemblera et lancera le traitement du signal audio dans une chaîne de plusieurs filtres.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster