Матеріал статті взято з мого
Запровадження
Ця стаття є початком серії статей про реалтайм обробки медіаданих за допомогою движка Mediastreamer2. У ході викладу буде задіяно мінімальні навички роботи в терміналі Linux та програмування мовою Сі.
Mediastreamer2 це VoIP-движок, що лежить в основі популярного open-source проекту програмного voip-телефону
Далі в тексті для зручності замість слова Mediastreamer2 будемо використовувати його російську нотацію: «медіастрімер».
Історія його створення не зовсім зрозуміла, але, судячи з його вихідного коду, він раніше використовував бібліотеку
В основі медіастрімера лежить архітектура звана "Data flow" (потік даних). Приклад такої архітектури зображений нижче.
У цій архітектурі алгоритм обробки даних визначається не програмним кодом, а схемою (графом) з'єднання функцій, які можна вибудовувати в будь-якому порядку. Ці функції називаються фільтрами.
Така архітектура дозволяє реалізувати функціонал обробки медіа у вигляді набору фільтрів, з'єднаних у схему обробки та передачі 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