Materiał artykułu pochodzi z mojego
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.
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
Sercem streamera multimediów jest architektura zwana „przepływem danych” (przepływ danych). Przykład takiej architektury pokazano na poniższym rysunku.
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
Źródło: www.habr.com