Вивчаємо VoIP-движок Mediastreamer2. Частина 1

Матеріал статті взято з мого дзен-каналу.

Запровадження

Ця стаття є початком серії статей про реалтайм обробки медіаданих за допомогою движка Mediastreamer2. У ході викладу буде задіяно мінімальні навички роботи в терміналі Linux та програмування мовою Сі.

Mediastreamer2 це VoIP-движок, що лежить в основі популярного open-source проекту програмного voip-телефону Лінфон. У Linphone Mediastreamer2 реалізує всі функції, пов'язані зі звуком і відео. Детальний перелік можливостей движка можна побачити на цій сторінці Mediastreamer. Вихідний код знаходиться тут: GitLab.

Далі в тексті для зручності замість слова Mediastreamer2 будемо використовувати його російську нотацію: «медіастрімер».

Історія його створення не зовсім зрозуміла, але, судячи з його вихідного коду, він раніше використовував бібліотеку Гліб, що ніби натякає нам, на можливу дальню спорідненість з GStreamer. У порівнянні з яким медіастрімер виглядає легковажнішим. Перша версія Linphone з'явилася в 2001 році, так що зараз медіастрімер існує і розвивається майже 20 років.

В основі медіастрімера лежить архітектура звана "Data flow" (потік даних). Приклад такої архітектури зображений нижче.

Вивчаємо VoIP-движок Mediastreamer2. Частина 1

У цій архітектурі алгоритм обробки даних визначається не програмним кодом, а схемою (графом) з'єднання функцій, які можна вибудовувати в будь-якому порядку. Ці функції називаються фільтрами.

Така архітектура дозволяє реалізувати функціонал обробки медіа у вигляді набору фільтрів, з'єднаних у схему обробки та передачі RTP-трафіку VoIP-телефону.

Можливість з'єднувати фільтри в довільні схеми, проста розробка нових фільтрів, реалізація медіастрімера у вигляді окремої самостійної бібліотеки, дозволяють використовувати його і в інших проектах. Причому проект може бути в області VoIP, оскільки є можливість додавати фільтри, зроблені своїми руками.

Бібліотека фільтрів, що поставляється за замовчуванням, досить багата і як вже було сказано, може бути розширена фільтрами власної розробки. Але спочатку опишемо готові фільтри, які постачаються разом із медіастрімером. Ось їх список:

Звукові фільтри

Захоплення та відтворення звуку

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Android native sound (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Audio Queue Service (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Audio Unit Service (Mac OS X)
  • Arts (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Програвач файлів (raw/wav/pcap файли) (Linux): MS_FILE_PLAYER
  • Програвач файлів (raw/wav файли) (Windows): MS_WINSND_READ
  • Запис у файл (wav файли) (Linux): MS_FILE_REC
  • Запис файлу (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
  • Windows Sound (Windows)

Кодування/декодування звуку

  • G.711 a-закон: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-закон: 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
  • Лінійна ІКМ: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Обробка звуку

  • Перетворення каналу (моно->стерео, стерео->моно): MS_CHANNEL_ADAPTER
  • Конференція: MS_CONF
  • Генератор DTMF: MS_DTMF_GEN
  • Пригнічення луна (speex): MS_SPEEX_EC
  • Еквалайзер: MS_EQUALIZER
  • Мікшер: MS_MIXER
  • Компенсатор втрати пакетів (PLC): MS_GENERIC_PLC
  • Ресемплер: MS_RESAMPLE
  • Детектор тонів: MS_TONE_DETECTOR
  • Управління гучністю та вимірювання рівня сигналу: MS_VOLUME

Фільтри відео

Захоплення та відтворення відео

  • Android захоплення
  • Android відтворення
  • AV Foundation захоплення (iOS)
  • AV Foundation відтворення (iOS)
  • DirectShow захоплення (Windows)
  • DrawDib відтворення (Windows)
  • External відтворення — Надсилання відео на верхній рівень
  • GLX відтворення (Linux): MS_GLXVIDEO
  • Mire - Synthetic moving picture: MS_MIRE
  • OpenGL відтворення (Mac OS X)
  • OpenGL ES2 відтворення (Android)
  • Quicktime захоплення (Mac OS X)
  • SDL відтворення: MS_SDL_OUT
  • Виведення статичних зображень: MS_STATIC_IMAGE
  • Video For Linux (V4L) захоплення (Linux): MS_V4L
  • Video For Linux 2 (V4L2) захоплення (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) захоплення (Windows)
  • Video4windows (DirectShow) захоплення (Windows CE)
  • Video For Windows (vfw) захоплення (Windows)
  • XV відтворення (Linux)

Кодування/декодування відео

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snow: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (тільки декодер): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Обробка відео

  • JPEG snapshot
  • Pixel format converter: MS_PIX_CONV
  • Ресайзер
  • Інші фільтри
  • Обмін блоками даних між тредами: MS_ITC_SOURCE, MS_ITC_SINK
  • Збір блоків даних із кількох входів на один вихід: MS_JOIN
  • RTP приймання/передача: MS_RTP_SEND, MS_RTP_RECV
  • Копіювання вхідних даних на кілька виходів: MS_TEE
  • Узгоджене навантаження: MS_VOID_SINK
  • Джерело тиші: MS_VOID_SOURCE

Плагіни

Звукові фільтри

  • AMR-NB кодер/декодер
  • G.729 кодер/декодер
  • iLBC кодер/декодер
  • SILK кодер/декодер

    Фільтри відео

  • H.264 програмний кодер
  • H.264 V4L2 кодер/декодер з апаратним прискоренням

Після короткого опису фільтра показано назву типу, що використовується при створенні нового екземпляра цього фільтра. У подальшому викладі ми будемо посилатись на цей список.

Встановлення під Linux Ubuntu

Тепер ми виконаємо установку медіастрімера на комп'ютер і зберемо нашу першу програму з ним.

Встановлення Mediastremer2 на комп'ютер або віртуальну машину під керуванням Ubuntu не потребує особливих навичок. Тут і далі символом «$» позначатимемо запрошення оболонки shell для введення команд. Тобто. якщо в лістингу ви бачите цей символ на початку рядка, то це рядок в якому показані команди для виконання в терміналі.

Передбачається, що під час виконання дій, описаних у цій статті, ваш комп'ютер має доступ до Інтернету.

Встановлення пакету libmediastremer-dev

Запускаємо термінал та набираємо команду:

$ sudo apt-get update

Буде запитаний пароль на внесення змін, введіть його та менеджер пакетів оновить свої бази. Після цього потрібно виконати:

$ sudo apt-get install libmediastreamer-dev

Будуть автоматично завантажені та встановлені необхідні пакети залежностей та сама бібліотека медіастрімера.

Загальний розмір завантажених deb-пакетів залежностей складе приблизно 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.

Складання та запуск пробної програми

Створюємо в будинки папку для наших навчальних проектів, назвемо її mstutorial:

$ mkdir ~/mstutorial

Скористайтеся вашим улюбленим текстовим редактором та створіть файл Сі-програми з ім'ям mstest.c з наступним змістом:

#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. Запускаємо програму:

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

У цьому лістингу ми бачимо повідомлення про помилки, які виводить бібліотека ALSA, вона використовується для керування звуковою картою. Самі розробники медіастрімера вважають, що це нормально. Ми в даному випадку з неволі погодимося з ними.

Тепер у нас все готове для роботи з медіастрімером. Ми встановили бібліотеку медіастрімера, інструмент компіляції та за допомогою пробної програми перевірили, що інструменти налаштовані, а медіастрімер успішно ініціалізується.

У наступному статті ми створимо додаток, який збере та запустить обробку звукового сигналу в ланцюжку з кількох фільтрів.

Джерело: habr.com