Матэрыял артыкула ўзяты з майго
Увядзенне
Гэты артыкул з'яўляецца пачаткам серыі артыкулаў аб рэалтайм апрацоўцы медыядадзеных з дапамогай рухавічка Mediastreamer2. У ходзе выкладу будуць задзейнічаны мінімальныя навыкі працы ў тэрмінале Linux і праграмавання на мове Сі.
Mediastreamer2 гэта VoIP-рухавічок, які ляжыць у аснове папулярнага open-source праекта праграмнага voip-тэлефона
Далей у тэксце, для зручнасці, замест слова Mediastreamer2 будзем выкарыстоўваць яго рускую натацыю: «медыястрымер».
Гісторыя яго стварэння не зусім зразумелая, але мяркуючы па яго зыходным кодзе, ён раней выкарыстоўваў бібліятэку
У аснове медыястрымера ляжыць архітэктура званая «Data flow» (струмень дадзеных). Прыклад такой архітэктуры намаляваны на малюнку ніжэй.
У гэтай архітэктуры алгарытм апрацоўкі дадзеных задаецца не праграмным кодам, а схемай (графам) злучэнні функцый, якія можна выбудоўваць у любым парадку. Гэтыя функцыі называюцца фільтрамі.
Такая архітэктура дазваляе рэалізаваць функцыянал апрацоўкі медыя ў выглядзе набору фільтраў, злучаных у схему апрацоўкі і перадачы 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