Materiał artykułu pochodzi z mojego .
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. . 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: .
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 , co sugeruje możliwe dalekie pokrewieństwo z . 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.

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 updateZostanie 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-devNiezbę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-devPrzykł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 gccSprawdzamy wynik, pytając o wersję kompilatora:
$ gcc --versionOdpowiedź 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 ~/mstutorialSkorzystaj 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:
$ ./mstestWynik 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 stworzymy aplikację, która zbierze i uruchomi przetwarzanie sygnału dźwiękowego w łańcuchu kilku filtrów.
Źródło: habr.com
