Poznawanie silnika Mediastreamer2 VoIP. Część 1

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

Wprowadzenie

Ten artykuł jest początkiem serii artykułów o przetwarzaniu multimediów w czasie rzeczywistym z wykorzystaniem silnika Mediastreamer2. Prezentacja dotyczyć będzie minimalnych umiejętności pracy w terminalu Linux oraz programowania w języku C.

Mediastreamer2 to silnik VoIP stojący za popularnym projektem telefonu VoIP o otwartym kodzie źródłowym. Linfon. W Linphone Mediastreamer2 realizuje wszystkie funkcje związane z dźwiękiem i obrazem. Szczegółową listę funkcji silnika można zobaczyć na tej stronie Mediastreamer. Kod źródłowy jest tutaj: GitLab.

W dalszej części tekstu, dla wygody, zamiast słowa Mediastreamer2 użyjemy jego rosyjskiej notacji: „streamer mediów”.

Historia jego powstania nie jest do końca jasna, ale sądząc po kodzie źródłowym, wcześniej korzystała z biblioteki Bez zająknienia, co niejako wskazuje na możliwy odległy związek z GStreamer. W porównaniu z którym streamer multimediów wygląda na lżejszy. Pierwsza wersja Linphone pojawiła się w 2001 roku, więc w tej chwili streamer multimediów istnieje i rozwija się już prawie 20 lat.

Sercem streamera multimediów jest architektura zwana „przepływem danych” (przepływ danych). Przykład takiej architektury pokazano na poniższym rysunku.

Poznawanie silnika Mediastreamer2 VoIP. Część 1

W tej architekturze algorytm przetwarzania danych jest określony nie kodem programu, ale schematem (grafem) łączenia funkcji, które można ułożyć w dowolnej kolejności. Funkcje te nazywane są filtrami.

Taka architektura umożliwia realizację funkcjonalności przetwarzania mediów w postaci zestawu filtrów połączonych ze schematem przetwarzania i transmisji ruchu RTP telefonu VoIP.

Możliwość łączenia filtrów w dowolne schematy, proste tworzenie nowych filtrów, implementacja streamera multimediów jako niezależnej oddzielnej biblioteki, pozwalają na wykorzystanie go w innych projektach. Ponadto projekt może dotyczyć VoIP, ponieważ istnieje możliwość dodania samodzielnie wykonanych filtrów.

Dostarczona domyślnie biblioteka filtrów jest dość bogata i jak już wspomniano, można ją rozszerzyć o filtry własnego projektu. Ale najpierw opiszmy gotowe filtry, które są dostarczane z media streamerem. Oto ich lista:

Filtry dźwięku

Przechwytywanie i odtwarzanie dźwięku

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Natywny dźwięk Androida (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Usługa kolejki audio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Usługa jednostki audio (Mac OS X)
  • Sztuka (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Odtwarzacz plików (pliki raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Odtwarzacz plików (pliki RAW/WAV) (Windows): MS_WINSND_READ
  • Zapis do pliku (pliki wav) (Linux): MS_FILE_REC
  • Zapis do pliku (pliki wav) (Windows): MS_WINSND_WRITE
  • Jednostka Mac Audio (Mac OS X)
  • MME (Windows)
  • OSS (Linux): MS_OSS_WRITE, MS_OSS_READ
  • Port Audio (Mac OS X)
  • PulseAudio (Linux): MS_PULSE_WRITE, MS_PULSE_READ
  • Dźwięk systemu Windows (Windows)

Kodowanie/dekodowanie dźwięku

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

Przetwarzanie dźwięku

  • Konwersja kanałów (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferencja: MS_CONF
  • Generator DTMF: MS_DTMF_GEN
  • Eliminacja echa (speex): MS_SPEEX_EC
  • Korektor: MS_EQUALIZER
  • Mikser: MS_MIXER
  • Kompensator utraty pakietów (PLC): MS_GENERIC_PLC
  • Ponowny próbnik: MS_RESAMPLE
  • Detektor tonów: MS_TONE_DETECTOR
  • Regulacja głośności i pomiar poziomu sygnału: MS_VOLUME

Filtry wideo

Przechwytywanie i odtwarzanie wideo

  • przechwytywanie Androida
  • Odtwarzanie na Androida
  • Przechwytywanie AV Foundation (iOS)
  • Odtwarzanie AV Foundation (iOS)
  • Przechwytywanie DirectShow (Windows)
  • Odtwarzanie DrawDib (Windows)
  • Odtwarzanie zewnętrzne - Wysyłanie wideo do górnej warstwy
  • Odtwarzanie GLX (Linux): MS_GLXVIDEO
  • Mire - Syntetyczny ruchomy obraz: MS_MIRE
  • Odtwarzanie OpenGL (Mac OS X)
  • Odtwarzanie OpenGL ES2 (Android)
  • Szybkie przechwytywanie (Mac OS X)
  • Odtwarzanie SDL: MS_SDL_OUT
  • Wyjście obrazu statycznego: MS_STATIC_IMAGE
  • Przechwytywanie wideo dla systemu Linux (V4L): MS_V4L
  • Przechwytywanie wideo dla systemu Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Przechwytywanie Video4windows (DirectShow) (Windows)
  • Przechwytywanie Video4windows (DirectShow) (Windows CE)
  • Przechwytywanie wideo dla systemu Windows (vfw) (Windows)
  • Odtwarzanie XV (Linux)

Kodowanie/dekodowanie wideo

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

Przetwarzanie wideo

  • migawka jpeg
  • Konwerter formatu pikseli: MS_PIX_CONV
  • Zmiana rozmiaru
  • Inne filtry
  • Wymiana bloków danych pomiędzy wątkami: MS_ITC_SOURCE, MS_ITC_SINK
  • Zbieranie bloków danych z wielu wejść do jednego wyjścia: MS_JOIN
  • Odbiór/transmisja RTP: MS_RTP_SEND, MS_RTP_RECV
  • Kopiowanie danych wejściowych do wielu wyjść: MS_TEE
  • Ładowanie zakończone: MS_VOID_SINK
  • Źródło ciszy: MS_VOID_SOURCE

Плагины

Filtry dźwięku

  • Koder/dekoder AMR-NB
  • Koder/dekoder G.729
  • Koder/dekoder iLBC
  • Koder/dekoder SILK

    Filtry wideo

  • Koder programowy H.264
  • Koder/dekoder H.264 V4L2 z akceleracją sprzętową

Po krótkim opisie filtra wyświetlana jest nazwa typu, która jest używana podczas tworzenia nowej instancji tego filtra. W dalszej części odniesiemy się do tej listy.

Instalacja pod Linuksem Ubuntu

Teraz zainstalujemy streamer multimediów na komputerze i zbudujemy z nim naszą pierwszą aplikację.

Instalacja Mediastremer2 na komputerze lub maszynie wirtualnej z systemem Ubuntu nie wymaga żadnych specjalnych umiejętności. Tutaj i poniżej symbol „$” będzie oznaczał zachętę powłoki do wprowadzania poleceń. Te. jeśli na liście widzisz ten symbol na początku wiersza, to jest to wiersz, w którym wyświetlane są polecenia do wykonania w terminalu.

Zakłada się, że podczas wykonywania czynności opisanych w tym artykule komputer ma dostęp do Internetu.

Instalowanie pakietu libmediastremer-dev

Uruchom terminal i wpisz polecenie:

$ sudo apt-get update

Zostaniesz poproszony o hasło, aby wprowadzić zmiany, wprowadź je, a menedżer pakietów zaktualizuje swoje bazy danych. Następnie musisz uruchomić:

$ sudo apt-get install libmediastreamer-dev

Niezbędne pakiety zależności i sama biblioteka streamerów multimediów 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 znaleźć za pomocą polecenia:

$ dpkg -s libmediastreamer-dev

Przykład odpowiedzi:

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/

Instalowanie narzędzi programistycznych

Zainstaluj kompilator C i towarzyszące mu narzędzia:

$ sudo apt-get install gcc

Sprawdzamy wynik, odpytując wersję kompilatora:

$ gcc --version

Odpowiedź powinna brzmieć mniej więcej tak:

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.

Tworzenie i uruchamianie aplikacji próbnej

Tworzymy w dom folder dla naszych projektów samouczków, nazwijmy to podręcznik:

$ mkdir ~/mstutorial

Użyj swojego ulubionego edytora tekstu i utwórz plik programu C o nazwie mtest.c o następującej treści:

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

Inicjuje streamer multimediów, drukuje powitanie i kończy działanie.

Zapisz plik i skompiluj aplikację testową za pomocą polecenia:

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

Zwróć uwagę, że linia

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

ujęte w cudzysłowy, które znajdują się na klawiaturze w tym samym miejscu co litera „Ё”.

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

$ ./mstest

Wynik będzie taki:

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.

Na tej liście widzimy komunikaty o błędach wyświetlane przez bibliotekę ALSA, która służy do sterowania kartą dźwiękową. Sami twórcy streamera multimediów uważają, że jest to normalne. W tym przypadku niechętnie się z nimi zgadzamy.

Teraz wszyscy jesteśmy gotowi do pracy ze streamerem multimediów. Zainstalowaliśmy bibliotekę streamera multimediów, narzędzie do kompilacji i za pomocą aplikacji próbnej sprawdziliśmy, czy narzędzia są skonfigurowane, a streamer multimediów pomyślnie się zainicjował.

Następny Artykuł stworzymy aplikację, która złoży i uruchomi przetwarzanie sygnału audio w łańcuchu kilku filtrów.

Źródło: www.habr.com