Истраживање Медиастреамер2 ВоИП механизма. Део 1

Материјал чланка је преузет са мог зен канал.

Увод

Овај чланак је почетак серије чланака о обради медија у реалном времену помоћу механизма Медиастреамер2. Презентација ће обухватити минималне вештине рада у Линук терминалу и програмирања на језику Ц.

Медиастреамер2 је ВоИП мотор иза популарног софтвера отвореног кода за воип телефонски пројекат. Линпхоне. У Линпхоне Медиастреамер2 имплементира све функције везане за звук и видео. Детаљну листу карактеристика мотора можете видети на овој страници Медиастреамер-а. Изворни код је овде: ГитЛаб.

Даље у тексту, ради погодности, уместо речи Медиастреамер2 користићемо његову руску нотацију: „медиа стреамер“.

Историја његовог настанка није сасвим јасна, али судећи по изворном коду, претходно је користио библиотеку Глиб, што, такорећи, наговештава могућу далеку везу са ГСтреамер. У поређењу са којим медијски стример изгледа лакше. Прва верзија Линпхоне-а појавила се 2001. године, тако да тренутно медијски стример постоји и развија се скоро 20 година.

У срцу медијског стримера је архитектура под називом „Проток података“ (проток података). Пример такве архитектуре приказан је на слици испод.

Истраживање Медиастреамер2 ВоИП механизма. Део 1

У овој архитектури, алгоритам обраде података није специфициран програмским кодом, већ шемом (графом) за повезивање функција које се могу распоредити било којим редоследом. Ове функције се називају филтери.

Ова архитектура омогућава имплементацију функционалности обраде медија у облику скупа филтера повезаних на шему обраде и преноса РТП саобраћаја ВоИП телефона.

Могућност комбиновања филтера у произвољне шеме, једноставан развој нових филтера, имплементација медијског стримера као независне засебне библиотеке, омогућавају да се користи у другим пројектима. Штавише, пројекат може бити у области ВоИП-а, јер је могуће додати филтере које сами направите.

Библиотека филтера која се подразумевано испоручује је прилично богата и, као што је већ поменуто, може се проширити филтерима нашег сопственог дизајна. Али прво, хајде да опишемо готове филтере који долазе са медијским стримером. Ево њихове листе:

Звучни филтери

Снимање и репродукција звука

  • Алса (Линук): МС_АЛСА_ВРИТЕ, МС_АЛСА_РЕАД
  • Андроид изворни звук (либмедиа): МС_АНДРОИД_СОУНД_ВРИТЕ, МС_АНДРОИД_СОУНД_РЕАД
  • Услуга аудио чекања (Мац ОС Кс): МС_АК_ВРИТЕ, МС_АК_РЕАД
  • Услуга аудио јединице (Мац ОС Кс)
  • Уметност (Линукс): МС_АРТС_ВРИТЕ, МС_АРТС_РЕАД
  • ДирецтСоунд (Виндовс): МС_ВИНСНДДС_ВРИТЕ, МС_ВИНСНДДС_РЕАД
  • Плејер датотека (рав/вав/пцап датотеке) (Линук): МС_ФИЛЕ_ПЛАИЕР
  • Плејер датотека (рав/вав датотеке) (Виндовс): МС_ВИНСНД_РЕАД
  • Уписи у датотеку (вав датотеке) (Линук): МС_ФИЛЕ_РЕЦ
  • Уписи у датотеку (вав датотеке) (Виндовс): МС_ВИНСНД_ВРИТЕ
  • Мац аудио јединица (Мац ОС Кс)
  • ММЕ (Виндовс)
  • ОСС (Линук): МС_ОСС_ВРИТЕ, МС_ОСС_РЕАД
  • ПортАудио (Мац ОС Кс)
  • ПулсеАудио (Линук): МС_ПУЛСЕ_ВРИТЕ, МС_ПУЛСЕ_РЕАД
  • Виндовс звук (Виндовс)

Аудио кодирање/декодирање

  • Г.711 а-закон: МС_АЛАВ_ДЕЦ, МС_АЛАВ_ЕНЦ
  • Г.711 µ-закон: МС_УЛАВ_ДЕЦ, МС_УЛАВ_ЕНЦ
  • Г.722: МС_Г722_ДЕЦ, МС_Г722_ЕНЦ
  • G.726: MS_G726_32_ENC, MS_G726_24_ENC, MS_G726_16_ENC
  • ГСМ: МС_ГСМ_ДЕЦ, МС_ГСМ_ЕНЦ
  • Линеарни ПЦМ: МС_Л16_ЕНЦ, МС_Л16_ДЕЦ
  • Брзина: МС_СПЕЕКС_ЕНЦ, МС_СПЕЕКС_ДЕЦ

Обрада звука

  • Конверзија канала (моно->стерео, стерео->моно): МС_ЦХАННЕЛ_АДАПТЕР
  • Конференција: МС_ЦОНФ
  • ДТМФ генератор: МС_ДТМФ_ГЕН
  • Поништавање еха (спеек): МС_СПЕЕКС_ЕЦ
  • Еквилајзер: МС_ЕКУАЛИЗЕР
  • Миксер: МС_МИКСЕР
  • Компензатор губитка пакета (ПЛЦ): МС_ГЕНЕРИЦ_ПЛЦ
  • Ресамплер: МС_РЕСАМПЛЕ
  • Детектор тонова: МС_ТОНЕ_ДЕТЕЦТОР
  • Контрола јачине звука и мерење нивоа сигнала: МС_ВОЛУМЕ

Видео филтери

Видео снимање и репродукција

  • андроид цаптуре
  • андроид репродукција
  • АВ Фоундатион цаптуре (иОС)
  • АВ Фоундатион репродукција (иОС)
  • ДирецтСхов Цаптуре (Виндовс)
  • ДравДиб репродукција (Виндовс)
  • Екстерна репродукција - Слање видео записа на горњи слој
  • ГЛКС репродукција (Линук): МС_ГЛКСВИДЕО
  • Мире - Синтетичка покретна слика: МС_МИРЕ
  • ОпенГЛ репродукција (Мац ОС Кс)
  • ОпенГЛ ЕС2 репродукција (Андроид)
  • Куицктиме Цаптуре (Мац ОС Кс)
  • СДЛ репродукција: МС_СДЛ_ОУТ
  • Излаз статичне слике: МС_СТАТИЦ_ИМАГЕ
  • Видео за Линук (В4Л) снимање (Линук): МС_В4Л
  • Видео за Линук 2 (В4Л2) снимање (Линук): МС_В4Л2_ЦАПТУРЕ
  • Видео4виндовс (ДирецтСхов) снимање (Виндовс)
  • Видео4виндовс (ДирецтСхов) снимање (Виндовс ЦЕ)
  • Видео за Виндовс (вфв) снимање (Виндовс)
  • КСВ репродукција (Линук)

Видео кодирање/декодирање

  • Х.263, Х.263-1998, МП4В-ЕС, ЈПЕГ, МЈПЕГ, снег: МС_МЈПЕГ_ДЕЦ, МС_Х263_ЕНЦ, МС_Х263_ДЕЦ
  • Х.264 (само декодер): МС_Х264_ДЕЦ
  • Теора: МС_ТХЕОРА_ЕНЦ, МС_ТХЕОРА_ДЕЦ
  • ВП8: МС_ВП8_ЕНЦ, МС_ВП8_ДЕЦ

Обрада видео записа

  • јпег снимак
  • Конвертор формата пиксела: МС_ПИКС_ЦОНВ
  • Ресизер
  • Остали филтери
  • Размена блокова података између нити: МС_ИТЦ_СОУРЦЕ, МС_ИТЦ_СИНК
  • Прикупљање блокова података са више улаза на један излаз: МС_ЈОИН
  • РТП пријем/пренос: МС_РТП_СЕНД, МС_РТП_РЕЦВ
  • Копирање улазних података на више излаза: МС_ТЕЕ
  • Завршено оптерећење: МС_ВОИД_СИНК
  • Извор тишине: МС_ВОИД_СОУРЦЕ

Плугинс

Звучни филтери

  • АМР-НБ кодер/декодер
  • Г.729 кодер/декодер
  • иЛБЦ кодер/декодер
  • СИЛК енкодер/декодер

    Видео филтери

  • Х.264 софтверски енкодер
  • Х.264 В4Л2 хардверски убрзани кодер/декодер

Након кратког описа филтера, приказује се назив типа који се користи приликом креирања нове инстанце овог филтера. У наставку ћемо се осврнути на ову листу.

Инсталација под Линук Убунту

Сада ћемо инсталирати медиа стреамер на рачунар и са њим направити нашу прву апликацију.

Инсталирање Медиастремер2 на рачунар или виртуелну машину која користи Убунту не захтева никакве посебне вештине. Овде и испод, симбол "$" ће означавати промпт љуске за унос команди. Оне. ако на листи видите овај симбол на почетку реда, онда је ово ред у коме се команде приказују да се извршавају у терминалу.

Претпоставља се да током корака у овом чланку ваш рачунар има приступ Интернету.

Инсталирање пакета либмедиастремер-дев

Покрените терминал и откуцајте команду:

$ sudo apt-get update

Биће вам затражена лозинка да бисте извршили измене, унесите је и менаџер пакета ће ажурирати своје базе података. Након тога, потребно је да покренете:

$ sudo apt-get install libmediastreamer-dev

Неопходни пакети зависности и сама библиотека стреамера медија биће аутоматски преузети и инсталирани.

Укупна величина преузетих деб пакета зависности биће приближно 35 МБ. Детаљи о инсталираном пакету могу се пронаћи помоћу команде:

$ 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/

Инсталирање развојних алата

Инсталирајте Ц компајлер и пратеће алате:

$ 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.

Израда и покретање пробне апликације

Стварамо у дом фасциклу за наше туториал пројекте, назовимо то мстуториал:

$ mkdir ~/mstutorial

Користите свој омиљени уређивач текста и креирајте Ц програмску датотеку под називом мстест.ц са следећим садржајем:

#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

Резултат ће бити овакав:

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.

У овој листи видимо поруке о грешци које АЛСА библиотека приказује, користи се за контролу звучне картице. Сами програмери медијског стримера сматрају да је то нормално. У овом случају, невољно се слажемо са њима.

Сада смо спремни да радимо са медијским стримером. Инсталирали смо библиотеку стреамера медија, алатку за компилацију и помоћу пробне апликације потврдили да су алати конфигурисани и да ли се медијски стример успешно иницијализује.

Следећи Чланак направићемо апликацију која ће саставити и покренути обраду аудио сигнала у ланцу од неколико филтера.

Извор: ввв.хабр.цом