Вывучаем 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 нацыянальнае асяроддзе (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