Εξερευνώντας τη μηχανή VoIP Mediastreamer2. Μέρος 1

Το υλικό του άρθρου είναι παρμένο από το δικό μου κανάλι ζεν.

Εισαγωγή

Αυτό το άρθρο είναι η αρχή μιας σειράς άρθρων σχετικά με την επεξεργασία πολυμέσων σε πραγματικό χρόνο χρησιμοποιώντας τη μηχανή Mediastreamer2. Η παρουσίαση θα περιλαμβάνει τις ελάχιστες δεξιότητες εργασίας στο τερματικό Linux και προγραμματισμού στη γλώσσα C.

Το Mediastreamer2 είναι η μηχανή VoIP πίσω από το δημοφιλές λογισμικό ανοιχτού κώδικα Voip phone project. τηλέφωνο. Στο Linphone, το Mediastreamer2 υλοποιεί όλες τις λειτουργίες που σχετίζονται με τον ήχο και το βίντεο. Μια λεπτομερής λίστα με τα χαρακτηριστικά του κινητήρα μπορείτε να δείτε σε αυτήν τη σελίδα Mediastreamer. Ο πηγαίος κώδικας είναι εδώ: GitLab.

Περαιτέρω στο κείμενο, για διευκόλυνση, αντί για τη λέξη Mediastreamer2 θα χρησιμοποιήσουμε τη ρωσική σημείωση της: "media streamer".

Η ιστορία της δημιουργίας του δεν είναι απολύτως σαφής, αλλά αν κρίνουμε από τον πηγαίο κώδικα, χρησιμοποιούσε προηγουμένως τη βιβλιοθήκη Ετοιμόλογος, που, όπως λες, υπαινίσσεται μια πιθανή μακρινή σχέση με GStreamer. Σε σύγκριση με το οποίο η ροή πολυμέσων φαίνεται πιο ελαφριά. Η πρώτη έκδοση του Linphone εμφανίστηκε το 2001, οπότε αυτή τη στιγμή ο media streamer υπάρχει και αναπτύσσεται για σχεδόν 20 χρόνια.

Στην καρδιά της ροής πολυμέσων βρίσκεται μια αρχιτεκτονική που ονομάζεται "Ροή δεδομένων" (ροή δεδομένων). Ένα παράδειγμα τέτοιας αρχιτεκτονικής φαίνεται στο παρακάτω σχήμα.

Εξερευνώντας τη μηχανή VoIP Mediastreamer2. Μέρος 1

Σε αυτήν την αρχιτεκτονική, ο αλγόριθμος επεξεργασίας δεδομένων καθορίζεται όχι από έναν κώδικα προγράμματος, αλλά από ένα σχήμα (γραφική παράσταση) για τη σύνδεση συναρτήσεων που μπορούν να τακτοποιηθούν με οποιαδήποτε σειρά. Αυτές οι λειτουργίες ονομάζονται φίλτρα.

Αυτή η αρχιτεκτονική καθιστά δυνατή την υλοποίηση της λειτουργικότητας επεξεργασίας πολυμέσων με τη μορφή ενός συνόλου φίλτρων που συνδέονται με το σχήμα επεξεργασίας και μετάδοσης κίνησης RTP τηλεφώνου VoIP.

Η δυνατότητα συνδυασμού φίλτρων σε αυθαίρετα σχήματα, η απλή ανάπτυξη νέων φίλτρων, η υλοποίηση του media streamer ως ανεξάρτητης ξεχωριστής βιβλιοθήκης, επιτρέπουν τη χρήση του σε άλλα έργα. Επιπλέον, το έργο μπορεί να είναι στον τομέα του VoIP, αφού υπάρχει η δυνατότητα προσθήκης φίλτρων κατασκευασμένων από τον ίδιο.

Η βιβλιοθήκη φίλτρων που παρέχεται από προεπιλογή είναι αρκετά πλούσια και, όπως ήδη αναφέρθηκε, μπορεί να επεκταθεί με φίλτρα δικής μας σχεδίασης. Αλλά πρώτα, ας περιγράψουμε τα έτοιμα φίλτρα που συνοδεύουν τη ροή πολυμέσων. Εδώ είναι η λίστα τους:

Φίλτρα ήχου

Λήψη και αναπαραγωγή ήχου

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Εγγενής ήχος Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Υπηρεσία ουράς ήχου (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Υπηρεσία μονάδας ήχου (Mac OS X)
  • Τέχνες (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Αναπαραγωγή αρχείων (αρχεία raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Πρόγραμμα αναπαραγωγής αρχείων (αρχεία raw/wav) (Windows): MS_WINSND_READ
  • Εγγραφή σε αρχείο (αρχεία wav) (Linux): MS_FILE_REC
  • Εγγραφή σε αρχείο (αρχεία wav) (Windows): MS_WINSND_WRITE
  • Μονάδα ήχου 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
  • Ήχος Windows (Windows)

Κωδικοποίηση/αποκωδικοποίηση ήχου

  • G.711 a-law: MS_ALAW_DEC, MS_ALAW_ENC
  • 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: MS_L16_ENC, MS_L16_DEC
  • Ταχύτητα: MS_SPEEX_ENC, MS_SPEEX_DEC

Επεξεργασία ήχου

  • Μετατροπή καναλιού (μονο->στερεοφωνικό, στερεοφωνικό->μονοφωνικό): MS_CHANNEL_ADAPTER
  • Συνέδριο: MS_CONF
  • Γεννήτρια DTMF: MS_DTMF_GEN
  • Ακύρωση ηχούς (speex): MS_SPEEX_EC
  • Ισοσταθμιστής: MS_EQUALIZER
  • Μίξερ: MS_MIXER
  • Αντισταθμιστής απώλειας πακέτων (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Ανιχνευτής τόνου: MS_TONE_DETECTOR
  • Έλεγχος έντασης και μέτρηση επιπέδου σήματος: MS_VOLUME

Φίλτρα βίντεο

Λήψη και αναπαραγωγή βίντεο

  • λήψη Android
  • αναπαραγωγή android
  • Λήψη του AV Foundation (iOS)
  • Αναπαραγωγή AV Foundation (iOS)
  • DirectShow Capture (Windows)
  • Αναπαραγωγή DrawDib (Windows)
  • Εξωτερική αναπαραγωγή - Αποστολή βίντεο στο ανώτερο επίπεδο
  • Αναπαραγωγή GLX (Linux): MS_GLXVIDEO
  • Mire - Συνθετική κινούμενη εικόνα: MS_MIRE
  • Αναπαραγωγή OpenGL (Mac OS X)
  • Αναπαραγωγή OpenGL ES2 (Android)
  • Quicktime Capture (Mac OS X)
  • Αναπαραγωγή SDL: MS_SDL_OUT
  • Έξοδος στατικής εικόνας: MS_STATIC_IMAGE
  • Λήψη βίντεο για Linux (V4L) (Linux): MS_V4L
  • Λήψη βίντεο για Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Λήψη Video4windows (DirectShow) (Windows)
  • Λήψη Video4windows (DirectShow) (Windows CE)
  • Λήψη βίντεο για Windows (vfw) (Windows)
  • Αναπαραγωγή XV (Linux)

Κωδικοποίηση/αποκωδικοποίηση βίντεο

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snow: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (μόνο αποκωδικοποιητής): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Επεξεργασία βίντεο

  • στιγμιότυπο jpeg
  • Μετατροπέας μορφής pixel: MS_PIX_CONV
  • Resizer
  • Άλλα φίλτρα
  • Ανταλλαγή μπλοκ δεδομένων μεταξύ νημάτων: MS_ITC_SOURCE, MS_ITC_SINK
  • Συλλογή μπλοκ δεδομένων από πολλαπλές εισόδους σε μία μόνο έξοδο: MS_JOIN
  • Λήψη/μετάδοση RTP: MS_RTP_SEND, MS_RTP_RECV
  • Αντιγραφή δεδομένων εισόδου σε πολλαπλές εξόδους: MS_TEE
  • Τερματισμένο φορτίο: MS_VOID_SINK
  • Πηγή Silence: MS_VOID_SOURCE

Плагины

Φίλτρα ήχου

  • Κωδικοποιητής/αποκωδικοποιητής AMR-NB
  • G.729 κωδικοποιητής/αποκωδικοποιητής
  • Κωδικοποιητής/αποκωδικοποιητής iLBC
  • Κωδικοποιητής/αποκωδικοποιητής SILK

    Φίλτρα βίντεο

  • Κωδικοποιητής λογισμικού H.264
  • H.264 V4L2 επιταχυνόμενος κωδικοποιητής/αποκωδικοποιητής υλικού

Μετά από μια σύντομη περιγραφή του φίλτρου, εμφανίζεται το όνομα του τύπου, το οποίο χρησιμοποιείται κατά τη δημιουργία μιας νέας παρουσίας αυτού του φίλτρου. Στη συνέχεια θα αναφερθούμε σε αυτή τη λίστα.

Εγκατάσταση στο Linux Ubuntu

Τώρα θα εγκαταστήσουμε τη ροή πολυμέσων στον υπολογιστή και θα δημιουργήσουμε την πρώτη μας εφαρμογή με αυτήν.

Η εγκατάσταση του Mediastremer2 σε υπολογιστή ή εικονική μηχανή με Ubuntu δεν απαιτεί ειδικές δεξιότητες. Εδώ και παρακάτω, το σύμβολο "$" θα υποδηλώνει τη γραμμή εντολών για την εισαγωγή εντολών. Εκείνοι. εάν στην καταχώριση βλέπετε αυτό το σύμβολο στην αρχή της γραμμής, τότε αυτή είναι η γραμμή στην οποία εμφανίζονται οι εντολές να εκτελούνται στο τερματικό.

Υποτίθεται ότι κατά τη διάρκεια των βημάτων αυτού του άρθρου, ο υπολογιστής σας έχει πρόσβαση στο Διαδίκτυο.

Εγκατάσταση του πακέτου libmediastremer-dev

Εκκινήστε το τερματικό και πληκτρολογήστε την εντολή:

$ sudo apt-get update

Θα σας ζητηθεί ένας κωδικός πρόσβασης για να κάνετε αλλαγές, να τον εισάγετε και ο διαχειριστής πακέτων θα ενημερώσει τις βάσεις δεδομένων του. Μετά από αυτό, πρέπει να εκτελέσετε:

$ sudo apt-get install libmediastreamer-dev

Τα απαραίτητα πακέτα εξαρτήσεων και η ίδια η βιβλιοθήκη της ροής πολυμέσων θα ληφθούν και θα εγκατασταθούν αυτόματα.

Το συνολικό μέγεθος των ληφθέντων πακέτων deb debency θα είναι περίπου 35 MB. Μπορείτε να βρείτε λεπτομέρειες σχετικά με το εγκατεστημένο πακέτο με την εντολή:

$ dpkg -s libmediastreamer-dev

Παράδειγμα απάντησης:

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/

Εγκατάσταση εργαλείων ανάπτυξης

Εγκαταστήστε τον μεταγλωττιστή C και τα συνοδευτικά εργαλεία του:

$ sudo apt-get install gcc

Ελέγχουμε το αποτέλεσμα ρωτώντας την έκδοση μεταγλωττιστή:

$ gcc --version

Η απάντηση πρέπει να είναι κάπως έτσι:

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.

Δημιουργία και εκτέλεση της δοκιμαστικής εφαρμογής

Δημιουργούμε μέσα σπίτι φάκελο για τα εκπαιδευτικά μας έργα, ας το ονομάσουμε mstutorial:

$ mkdir ~/mstutorial

Χρησιμοποιήστε το αγαπημένο σας πρόγραμμα επεξεργασίας κειμένου και δημιουργήστε ένα αρχείο προγράμματος C που ονομάζεται mstest.γ με το ακόλουθο περιεχόμενο:

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

Αρχικοποιεί τη ροή πολυμέσων, εκτυπώνει έναν χαιρετισμό και εξέρχεται.

Αποθηκεύστε το αρχείο και μεταγλωττίστε την εφαρμογή δοκιμής με την εντολή:

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

Σημειώστε ότι η γραμμή

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

περικλείεται σε εισαγωγικά, τα οποία βρίσκονται στο πληκτρολόγιο στην ίδια θέση με το γράμμα "Ё".

Εάν το αρχείο δεν περιέχει σφάλματα, τότε μετά τη μεταγλώττιση θα εμφανιστεί ένα αρχείο στον κατάλογο mstest. Ξεκινάμε το πρόγραμμα:

$ ./mstest

Το αποτέλεσμα θα είναι ως εξής:

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.

Σε αυτήν την καταχώριση, βλέπουμε τα μηνύματα σφάλματος που εμφανίζει η βιβλιοθήκη ALSA, χρησιμοποιείται για τον έλεγχο της κάρτας ήχου. Οι ίδιοι οι προγραμματιστές του media streamer πιστεύουν ότι αυτό είναι φυσιολογικό. Σε αυτή την περίπτωση, συμφωνούμε απρόθυμα μαζί τους.

Τώρα είμαστε όλοι έτοιμοι να δουλέψουμε με τη ροή πολυμέσων. Εγκαταστήσαμε τη βιβλιοθήκη της ροής πολυμέσων, το εργαλείο μεταγλώττισης και χρησιμοποιώντας μια δοκιμαστική εφαρμογή, επαληθεύσαμε ότι τα εργαλεία έχουν διαμορφωθεί και ότι η ροή πολυμέσων προετοιμάζεται με επιτυχία.

Επόμενο άρθρο θα δημιουργήσουμε μια εφαρμογή που θα συναρμολογεί και θα τρέχει την επεξεργασία ενός ηχητικού σήματος σε μια αλυσίδα πολλών φίλτρων.

Πηγή: www.habr.com