Mediastreamer2 VoIP mühərriki araşdırılır. 1-ci hissə

Məqalənin materialı məndən götürülmüşdür zen kanalı.

Giriş

Bu məqalə Mediastreamer2 mühərrikindən istifadə edərək real vaxt rejimində medianın işlənməsi haqqında bir sıra məqalələrin başlanğıcıdır. Təqdimat Linux terminalında işləmək və C dilində proqramlaşdırma üzrə minimum bacarıqları əhatə edəcək.

Mediastreamer2 məşhur açıq mənbəli proqram voip telefon layihəsinin arxasında duran VoIP mühərrikidir. Linfon. Linphone Mediastreamer2-də səs və video ilə bağlı bütün funksiyaları həyata keçirir. Mühərrik xüsusiyyətlərinin ətraflı siyahısını bu Mediastreamer səhifəsində görmək olar. Mənbə kodu buradadır: GitLab.

Daha sonra mətndə rahatlıq üçün Mediastreamer2 sözünün əvəzinə onun rus dilində qeydindən istifadə edəcəyik: “media streamer”.

Yaradılma tarixi tam aydın deyil, lakin mənbə koduna görə o, əvvəllər kitabxanadan istifadə edirdi glibilə mümkün olan uzaq əlaqəyə işarə edən kimi GStreamer. Bununla müqayisədə media yayımlayıcısı daha yüngül görünür. Linphone-un ilk versiyası 2001-ci ildə ortaya çıxdı, buna görə də hazırda media strimeri təxminən 20 ildir mövcuddur və inkişaf edir.

Media axınının mərkəzində "Məlumat axını" (məlumat axını) adlı bir arxitektura dayanır. Belə bir memarlığın nümunəsi aşağıdakı şəkildə göstərilmişdir.

Mediastreamer2 VoIP mühərriki araşdırılır. 1-ci hissə

Bu arxitekturada verilənlərin emalı alqoritmi proqram kodu ilə deyil, istənilən ardıcıllıqla düzülə bilən funksiyaları birləşdirən sxem (qrafik) ilə müəyyən edilir. Bu funksiyalara filtrlər deyilir.

Bu arxitektura media emalı funksiyasını VoIP telefon RTP trafikinin emalı və ötürülməsi sxeminə qoşulmuş filtrlər dəsti şəklində həyata keçirməyə imkan verir.

Filtrləri ixtiyari sxemlərdə birləşdirmək imkanı, yeni filtrlərin sadə işlənməsi, media striminin müstəqil ayrıca kitabxana kimi həyata keçirilməsi onu digər layihələrdə istifadə etməyə imkan verir. Bundan əlavə, layihə VoIP sahəsində ola bilər, çünki özünüz tərəfindən hazırlanmış filtrləri əlavə etmək mümkündür.

Varsayılan olaraq təqdim edilən filtr kitabxanası kifayət qədər zəngindir və artıq qeyd edildiyi kimi, öz dizaynımızın filtrləri ilə genişləndirilə bilər. Ancaq əvvəlcə media yayımlayıcı ilə birlikdə gələn hazır filtrləri təsvir edək. Budur onların siyahısı:

Səs filtrləri

Audio tutma və oxutma

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Android yerli səsi (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Audio növbə xidməti (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Audio Vahid Xidməti (Mac OS X)
  • İncəsənət (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Fayl pleyeri (raw/wav/pcap faylları) (Linux): MS_FILE_PLAYER
  • Fayl pleyeri (raw/wav faylları) (Windows): MS_WINSND_READ
  • Fayla yaz (wav faylları) (Linux): MS_FILE_REC
  • Fayla yaz (wav faylları) (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 Səs (Windows)

Audio kodlaşdırma/şifrləmə

  • G.711 qanunu: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-qanun: 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
  • Xətti PCM: MS_L16_ENC, MS_L16_DEC
  • Sürət: MS_SPEEX_ENC, MS_SPEEX_DEC

Səs emalı

  • Kanal çevrilməsi (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konfrans: MS_CONF
  • DTMF Generator: MS_DTMF_GEN
  • Echo ləğvi (sürətli): MS_SPEEX_EC
  • Ekvalayzer: MS_EQUALIZER
  • Mikser: MS_MIXER
  • Paket İtki Kompensatoru (PLC): MS_GENERIC_PLC
  • Yenidən nümunə götürən: MS_RESAMPLE
  • Ton detektoru: MS_TONE_DETECTOR
  • Səs səviyyəsinə nəzarət və siqnal səviyyəsinin ölçülməsi: MS_VOLUME

Video filtrləri

Video çəkmə və oxutma

  • android ələ keçirmə
  • android oxutma
  • AV Foundation ələ keçirmə (iOS)
  • AV Foundation oxutma (iOS)
  • DirectShow Capture (Windows)
  • DrawDib oxutma (Windows)
  • Xarici oxutma - Videonun üst təbəqəyə göndərilməsi
  • GLX oxutma (Linux): MS_GLXVIDEO
  • Mire - Sintetik hərəkətli şəkil: MS_MIRE
  • OpenGL oxutma (Mac OS X)
  • OpenGL ES2 oxutma (Android)
  • Quicktime Capture (Mac OS X)
  • SDL oxutma: MS_SDL_OUT
  • Statik şəkil çıxışı: MS_STATIC_IMAGE
  • Linux (V4L) üçün video (Linux): MS_V4L
  • Linux 2 (V4L2) üçün video çəkiliş (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) çəkmə (Windows)
  • Video4windows (DirectShow) çəkmə (Windows CE)
  • Windows üçün video (vfw) çəkmə (Windows)
  • XV oxutma (Linux)

Video kodlaşdırma/deşifrə

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Qar: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (yalnız dekoder): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Videonun işlənməsi

  • jpeg snapshot
  • Piksel formatı çeviricisi: MS_PIX_CONV
  • Resizer
  • Digər filtrlər
  • Mövzular arasında məlumat bloklarının mübadiləsi: MS_ITC_SOURCE, MS_ITC_SINK
  • Çox girişdən bir çıxışa məlumat bloklarının toplanması: MS_JOIN
  • RTP qəbulu/ötürməsi: MS_RTP_SEND, MS_RTP_RECV
  • Giriş məlumatlarının çoxlu çıxışlara kopyalanması: MS_TEE
  • Son yüklənmə: MS_VOID_SINK
  • Sükut Mənbəsi: MS_VOID_SOURCE

Plugins

Səs filtrləri

  • AMR-NB kodlayıcı/dekoder
  • G.729 kodlayıcı/dekoder
  • iLBC kodlayıcı/dekoder
  • SILK kodlayıcı/dekoder

    Video filtrləri

  • H.264 proqram kodlayıcısı
  • H.264 V4L2 hardware sürətləndirilmiş kodlayıcı/dekoder

Süzgəcin qısa təsvirindən sonra növün adı göstərilir, bu filtrin yeni nümunəsi yaradılarkən istifadə olunur. Bundan sonra bu siyahıya müraciət edəcəyik.

Linux Ubuntu altında quraşdırma

İndi biz media streamer-i kompüterə quraşdıracağıq və onunla ilk tətbiqimizi quracağıq.

Mediastremer2-nin Ubuntu ilə işləyən kompüterdə və ya virtual maşında quraşdırılması heç bir xüsusi bacarıq tələb etmir. Burada və aşağıda "$" simvolu əmrlərin daxil edilməsi üçün qabıq sorğusunu ifadə edəcək. Bunlar. əgər siyahıda sətrin əvvəlində bu simvolu görürsünüzsə, bu, terminalda yerinə yetiriləcək əmrlərin göstərildiyi sətirdir.

Bu məqalədəki addımlar zamanı kompüterinizin İnternetə çıxışı olduğu güman edilir.

libmediastremer-dev paketinin quraşdırılması

Terminalı işə salın və əmri yazın:

$ sudo apt-get update

Dəyişikliklər etmək üçün sizdən parol tələb olunacaq, onu daxil edin və paket meneceri məlumat bazalarını yeniləyəcək. Bundan sonra qaçmaq lazımdır:

$ sudo apt-get install libmediastreamer-dev

Lazımi asılılıq paketləri və media yayımlayıcı kitabxanasının özü avtomatik yüklənəcək və quraşdırılacaq.

Yüklənmiş asılılıq deb paketlərinin ümumi ölçüsü təxminən 35 MB olacaq. Quraşdırılmış paket haqqında təfərrüatları komanda ilə tapmaq olar:

$ dpkg -s libmediastreamer-dev

Cavab nümunəsi:

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/

İnkişaf alətlərinin quraşdırılması

C kompilyatorunu və onu müşayiət edən alətləri quraşdırın:

$ sudo apt-get install gcc

Nəticəni tərtibçi versiyasını sorğulayaraq yoxlayırıq:

$ gcc --version

Cavab belə bir şey olmalıdır:

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.

Sınaq Tətbiqinin qurulması və icrası

Biz yaradırıq ev Dərslik layihələrimiz üçün qovluq, gəlin onu adlandıraq mstutorial:

$ mkdir ~/mstutorial

Sevimli mətn redaktorunuzdan istifadə edin və adlı C proqram faylı yaradın mstest.c aşağıdakı məzmunla:

#include "stdio.h"
#include <mediastreamer2/mscommon.h>
int main()
{
  ms_init();
  printf ("Mediastreamer is ready.n");
}

O, media yayımlayıcısını işə salır, salamı çap edir və çıxır.

Faylı yadda saxlayın və test proqramını əmrlə tərtib edin:

$ gcc mstest.c -o mstest `pkg-config mediastreamer --libs --cflags`

Qeyd edək ki, xətt

`pkg-config mediastreamer --libs --cflags`

Klaviaturada "Ё" hərfi ilə eyni yerdə yerləşən dırnaq işarələri içərisindədir.

Əgər faylda səhvlər yoxdursa, tərtib edildikdən sonra kataloqda bir fayl görünəcək mtest. Proqrama başlayırıq:

$ ./mstest

Nəticə belə olacaq:

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.

Bu siyahıda ALSA kitabxanasının göstərdiyi səhv mesajlarını görürük, o, səs kartını idarə etmək üçün istifadə olunur. Media striminin tərtibatçıları özləri bunun normal olduğuna inanırlar. Belə olan halda biz onlarla könülsüz razılaşırıq.

İndi hamımız media axını ilə işləməyə hazırıq. Biz media streamer kitabxanasını, kompilyasiya alətini quraşdırdıq və sınaq proqramından istifadə edərək, alətlərin konfiqurasiya edildiyini və media axınının uğurla işə salındığını təsdiq etdik.

Sonrakı məqalə bir neçə filtrdən ibarət zəncirdə səs siqnalının işlənməsini toplayacaq və işə salacaq bir proqram yaradacağıq.

Mənbə: www.habr.com