Zagłębiamy się w silnik VoIP Mediastreamer2. Część 1

Materiał artykułu pochodzi z mojego kanału Zen.

Wprowadzenie

Ten artykuł stanowi wprowadzenie do serii artykułów na temat przetwarzania danych mediów w czasie rzeczywistym przy użyciu silnika Mediastreamer2. W trakcie opisu będą wykorzystywane minimalne umiejętności w pracy w terminalu Linux oraz programowania w języku C.

Mediastreamer2 to silnik VoIP, na którym oparty jest popularny projekt open-source programu do telefonii VoIP. Linphone. W Linphone Mediastreamer2 implementuje wszystkie funkcje związane z dźwiękiem i wideo. Szczegółową listę możliwości silnika można zobaczyć na tej stronie Mediastreamer. Kod źródłowy znajduje się tutaj: GitLab.

W dalszej części tekstu dla wygody, zamiast słowa Mediastreamer2 użyjemy jego polskiej notacji: „mediastreamer”.

Historia jego powstania nie jest do końca jasna, ale sądząc po jego kodzie źródłowym, wcześniej korzystał z biblioteki Glib, co sugeruje możliwe dalekie pokrewieństwo z GStreamer. W porównaniu z nim mediastreamer wydaje się bardziej lekki. Pierwsza wersja Linphone pojawiła się w 2001 roku, więc w tej chwili mediastreamer istnieje i rozwija się od niemal 20 lat.

Na podstawie mediastreamera leży architektura zwana „Data flow” (przepływ danych). Przykład takiej architektury przedstawiony jest na poniższym rysunku.

Zagłębiamy się w silnik VoIP Mediastreamer2. Część 1

W tej architekturze algorytm przetwarzania danych jest określany nie przez kod programistyczny, ale przez schemat (graf) połączeń funkcji, które można układać w dowolnej kolejności. Te funkcje nazywane są filtrami.

Taka architektura umożliwia realizację funkcji przetwarzania mediów w formie zestawu filtrów połączonych w schemę przetwarzania i transmisji ruchu RTP telefonu VoIP.

Możliwość łączenia filtrów w dowolne schemy, łatwe opracowywanie nowych filtrów, realizacja mediastreamera jako samodzielnej, odrębnej biblioteki, umożliwiają jego wykorzystanie również w innych projektach. Projekt może być w obszarze VoIP, ponieważ istnieje możliwość dodawania filtrów wykonanych samodzielnie.

Dostarczana domyślnie biblioteka filtrów jest wystarczająco bogata i jak już wspomniano, może być rozszerzona o filtry stworzone we własnym zakresie. Ale najpierw opiszemy gotowe filtry, które są dostarczane razem z mediastreamerem. Oto ich lista:

Filtry dźwiękowe

Przechwytywanie i odtwarzanie dźwięku

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Dźwięk natywny Androida (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Usługa kolejek audio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Usługa jednostek audio (Mac OS X)
  • Arts (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Odtwarzacz plików (raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Odtwarzacz plików (raw/wav) (Windows): MS_WINSND_READ
  • Nagrywanie do pliku (wav) (Linux): MS_FILE_REC
  • Nagrywanie do pliku (wav) (Windows): MS_WINSND_WRITE
  • Mac Audio Unit (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
  • Dźwięk w systemie Windows (Windows)

Kodowanie/dekodowanie dźwięku

  • G.711 a-zakon: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-zakon: 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
  • Liniowa PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Przetwarzanie dźwięku

  • Adaptacja kanału (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferencja: MS_CONF
  • Generator DTMF: MS_DTMF_GEN
  • Tłumienie echa (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mikser: MS_MIXER
  • Kompensator utraty pakietów (PLC): MS_GENERIC_PLC
  • Próbkowanie: MS_RESAMPLE
  • Detektor tonów: MS_TONE_DETECTOR
  • Kontrola głośności i pomiar poziomu sygnału: MS_VOLUME

Filtry wideo

Przechwytywanie i odtwarzanie wideo

  • Przechwytywanie Android
  • Odtwarzanie Android
  • Przechwytywanie AV Foundation (iOS)
  • Odtwarzanie AV Foundation (iOS)
  • Przechwytywanie DirectShow (Windows)
  • Odtwarzanie DrawDib (Windows)
  • Odtwarzanie zewnętrzne — wysyłanie wideo na najwyższy poziom
  • Odtwarzanie GLX (Linux): MS_GLXVIDEO
  • Mire — syntetyczny ruchomy obraz: MS_MIRE
  • Odtwarzanie OpenGL (Mac OS X)
  • Odtwarzanie OpenGL ES2 (Android)
  • Przechwytywanie Quicktime (Mac OS X)
  • Odtwarzanie SDL: MS_SDL_OUT
  • Wyjście statycznych obrazów: MS_STATIC_IMAGE
  • Video For Linux (V4L) przechwytywanie (Linux): MS_V4L
  • Video For Linux 2 (V4L2) przechwytywanie (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) przechwytywanie (Windows)
  • Video4windows (DirectShow) przechwytywanie (Windows CE)
  • Video For Windows (vfw) przechwytywanie (Windows)
  • XV odtwarzanie (Linux)

Kodowanie/dekodowanie wideo

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

Przetwarzanie wideo

  • Zrzut JPEG
  • Konwerter formatu pikseli: MS_PIX_CONV
  • Resizer
  • Inne filtry
  • Wymiana bloków danych między wątkami: MS_ITC_SOURCE, MS_ITC_SINK
  • Zbieranie bloków danych z wielu wejść na jeden wyjście: MS_JOIN
  • RTP odbiór/nadaż: MS_RTP_SEND, MS_RTP_RECV
  • Kopiowanie danych wejściowych na wiele wyjść: MS_TEE
  • Spójnym obciążeniem: MS_VOID_SINK
  • Źródło ciszy: MS_VOID_SOURCE

Wtyczki

Filtry dźwiękowe

  • Kodowanie/dekodowanie AMR-NB
  • Kodowanie/dekodowanie G.729
  • Kodowanie/dekodowanie iLBC
  • Kodowanie/dekodowanie SILK

    Filtry wideo

  • Programowy kodowany H.264
  • H.264 V4L2 kodowanie/dekodowanie z przyspieszeniem sprzętowym

Po krótkim opisie filtru jest podana nazwa typu, który jest używany przy tworzeniu nowej instancji tego filtru. W dalszej części tekstu będziemy się odwoływać do tej listy.

Instalacja na Linux Ubuntu

Teraz przeprowadzimy instalację mediastreamera na komputerze i stworzymy nasze pierwsze aplikacje z nim.

Instalacja Mediastremer2 na komputerze lub maszynie wirtualnej działającej pod Ubuntu nie wymaga szczególnych umiejętności. Tutaj i dalej symbolem „$” będziemy oznaczać zachętę do wpisania poleceń w powłoce. Tzn. jeśli w wylistowaniu widzisz ten symbol na początku wiersza, oznacza to, że jest to wiersz, w którym pokazane są polecenia do wykonania w terminalu.

Zakłada się, że w trakcie wykonywania działań opisanych w tym artykule, twój komputer ma dostęp do Internetu.

Instalacja pakietu libmediastremer-dev

Uruchamiamy terminal i wpisujemy polecenie:

$ sudo apt-get update

Zostanie poproszony o hasło do wprowadzenia zmian, wprowadź je, a menedżer pakietów zaktualizuje swoje bazy. Po tym trzeba wykonać:

$ sudo apt-get install libmediastreamer-dev

Niezbędne pakiety zależności i sama biblioteka mediastreamera zostaną automatycznie pobrane i zainstalowane.

Całkowity rozmiar pobranych pakietów deb zależności wyniesie około 35 MB. Szczegóły dotyczące zainstalowanego pakietu można uzyskać za pomocą polecenia:

$ dpkg -s libmediastreamer-dev

Przykład odpowiedzi:

Pakiet: libmediastreamer-dev
Status: zainstalowany prawidłowo
Priorytet: opcjonalny
Sekcja: libdevel
Zainstalowany rozmiar: 244
Utrzymujący: Deweloperzy Ubuntu 
Architektura: amd64
Źródło: linphone
Wersja: 3.6.1-2.5
Zależy od: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Opis: Biblioteka mediów telefonu internetowego Linphone - pliki rozwojowe
Linphone to internetowy telefon audio i wideo używający protokołu SIP. Posiada interfejs GTK+ i konsolowy, obejmuje dużą różnorodność kodeków audio i wideo oraz zapewnia funkcje IM.
.
Ten pakiet zawiera biblioteki rozwojowe do obsługi operacji multimedialnych.
Oryginalny utrzymujący: Zespół VoIP Debiana 
Strona domowa: http://www.linphone.org/

Instalacja narzędzi deweloperskich

Instalujemy kompilator C i jego towarzyszące narzędzia:

$ sudo apt-get install gcc

Sprawdzamy wynik, pytając o wersję kompilatora:

$ gcc --version

Odpowiedź powinna wyglądać mniej więcej tak:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
To jest oprogramowanie wolne; zobacz źródło dotyczące warunków kopiowania. Nie ma
żadnej gwarancji; nawet za JAKOŚĆ lub PRZYDATNOŚĆ DO KONKRETNEGO CELU.

Kompilacja i uruchamianie próbnej aplikacji

Tworzymy w home folder dla naszych projektów edukacyjnych, nazwiemy go mstutorial:

$ mkdir ~/mstutorial

Skorzystaj z ulubionego edytora tekstu i stwórz plik programu C o nazwie mstest.c o następującej treści:

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

Inicjalizuje mediator strumieniowy, wyświetla powitanie i kończy działanie.

Zapisujemy plik i kompilujemy aplikację testową poleceniem:

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

Zwróć uwagę, że wiersz

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

jest ujęty w apostrofy, które znajdują się na klawiaturze tam, gdzie litera „Ё”.

Jeśli plik nie zawiera błędów, po kompilacji w katalogu pojawi się plik mstest. Uruchamiamy program:

$ ./mstest

Wynik będzie taki:

ALSA lib conf.c:4738:(snd_config_expand) Nieznane parametry 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Nieprawidłowy CTL default:0
ortp-warning-Nie udało się podłączyć miksera do karty: Nieprawidłowy argument
ALSA lib conf.c:4738:(snd_config_expand) Nieznane parametry 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Nieznany PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Nieznane parametry 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Nieznany PCM default:0
ortp-warning-Dziwne, karta dźwiękowa HDA Intel PCH wygląda na to, że nie jest w stanie niczego, ponowne próby z plughw...
Mediator strumieniowy jest gotowy.

W tym zleceniu widzimy komunikaty o błędach, które generuje biblioteka ALSA, używana do zarządzania kartą dźwiękową. Sami twórcy mediatora strumieniowego uważają, że to normalne. W tej sytuacji zmuszeni jesteśmy się z nimi zgodzić.

Teraz mamy wszystko gotowe do pracy z mediatorem strumieniowym. Zainstalowaliśmy bibliotekę mediatora strumieniowego, narzędzie do kompilacji i za pomocą próbnej aplikacji sprawdziliśmy, że narzędzia są skonfigurowane, a mediator strumieniowy jest poprawnie inicjalizowany.

W następnej artykuł stworzymy aplikację, która zbierze i uruchomi przetwarzanie sygnału dźwiękowego w łańcuchu kilku filtrów.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster