Esplorante la Mediastreamer2 VoIP-motoron. Parto 1

La materialo de la artikolo estas prenita el mia zen kanalo.

Enkonduko

Ĉi tiu artikolo estas la komenco de serio de artikoloj pri realtempa amaskomunikila prilaborado uzante la Mediastreamer2-motoron. La prezento implikos la minimumajn kapablojn labori en la Linuksa terminalo kaj programado en la C-lingvo.

Mediastreamer2 estas la VoIP-motoro malantaŭ la populara malfermfonta programaro voip-telefonprojekto. telefono. En Linphone Mediastreamer2 efektivigas ĉiujn funkciojn rilatajn al sono kaj video. Detala listo de motoraj funkcioj povas esti vidita sur ĉi tiu Mediastreamer-paĝo. La fontkodo estas ĉi tie: GitLab.

Plue en la teksto, por oportuno, anstataŭ la vorto Mediastreamer2 ni uzos ĝian rusan notacion: "media streamer".

La historio de ĝia kreado ne estas tute klara, sed se juĝante laŭ sia fontkodo, ĝi antaŭe uzis la bibliotekon glib, kiu, kvazaŭ, aludas eblan malproksiman rilaton kun GStreamer. Kompare kun kiu la amaskomunikila streamer aspektas pli malpeza. La unua versio de Linphone aperis en 2001, do nuntempe la amaskomunikila streamer ekzistas kaj disvolviĝas dum preskaŭ 20 jaroj.

Ĉe la koro de la amaskomunikila streamer estas arkitekturo nomita "Data fluo" (datumfluo). Ekzemplo de tia arkitekturo estas montrita en la figuro malsupre.

Esplorante la Mediastreamer2 VoIP-motoron. Parto 1

En ĉi tiu arkitekturo, la datumtraktadalgoritmo estas precizigita ne per programkodo, sed per skemo (grafo) por ligado de funkcioj kiuj povas esti aranĝitaj en iu ordo. Ĉi tiuj funkcioj estas nomataj filtriloj.

Ĉi tiu arkitekturo ebligas efektivigi la funkciojn pri amaskomunikilaro en formo de aro de filtriloj konektitaj al la VoIP-telefona RTP-trafika pritraktado kaj transdono.

La kapablo kombini filtrilojn en arbitrajn skemojn, la simpla evoluo de novaj filtriloj, la efektivigo de la amaskomunikilara streamer kiel sendependa aparta biblioteko, permesas ĝin esti uzata en aliaj projektoj. Krome, la projekto povas esti en la kampo de VoIP, ĉar eblas aldoni filtrilojn faritajn de si mem.

La filtrilbiblioteko defaŭlte provizita estas sufiĉe riĉa kaj, kiel jam menciite, povas esti etendita per filtriloj de nia propra dezajno. Sed unue, ni priskribu la pretajn filtrilojn, kiuj venas kun la amaskomunikila streamer. Jen ilia listo:

Sonfiltriloj

Sonkaptado kaj reprodukto

  • Alsa (Linukso): MS_ALSA_WRITE, MS_ALSA_READ
  • Android-denaska sono (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Servo de Aŭdvico (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Audio-Unuo-Servo (Mac OS X)
  • Artoj (Linukso): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Vindozo): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Dosierludanto (raw/wav/pcap-dosieroj) (Linukso): MS_FILE_PLAYER
  • Dosierludanto (krudaj/wav-dosieroj) (Vindozo): MS_WINSND_READ
  • Skribu al dosiero (wav-dosieroj) (Linukso): MS_FILE_REC
  • Skribu al dosiero (wav-dosieroj) (Vindozo): MS_WINSND_WRITE
  • Mac Audio-Unuo (Mac OS X)
  • MME (Vindozo)
  • OSS (Linukso): MS_OSS_WRITE, MS_OSS_READ
  • PortAudio (Mac OS X)
  • PulseAudio (Linukso): MS_PULSE_WRITE, MS_PULSE_READ
  • Vindoza Sono (Vindozo)

Aŭdiokodado/malkodado

  • G.711 a-leĝo: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-leĝo: 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
  • Lineara PCM: MS_L16_ENC, MS_L16_DEC
  • Spekturo: MS_SPEEX_ENC, MS_SPEEX_DEC

Sonprilaborado

  • Kanala konvertiĝo (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferenco: MS_CONF
  • DTMF Generatoro: MS_DTMF_GEN
  • Nuligo de eĥo (speex): MS_SPEEX_EC
  • Ekvalizilo: MS_EQUALIZER
  • Miksilo: MS_MIXER
  • Kompensilo de Paka Perdo (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Tondetektilo: MS_TONE_DETECTOR
  • Volumenkontrolo kaj signalnivela mezurado: MS_VOLUME

Videofiltriloj

Videokapto kaj reproduktado

  • Android-kapto
  • Android-reproduktado
  • Kapto de AV Foundation (iOS)
  • Reproduktado de AV Foundation (iOS)
  • DirectShow Capture (Vindozo)
  • DrawDib-reproduktado (Vindozo)
  • Ekstera reprodukto - Sendado de video al la supra tavolo
  • GLX-reproduktado (Linukso): MS_GLXVIDEO
  • Mire - Sinteza kortuŝa bildo: MS_MIRE
  • OpenGL-reproduktado (Mac OS X)
  • OpenGL ES2-reproduktado (Android)
  • Quicktime Capture (Mac OS X)
  • SDL-reproduktado: MS_SDL_OUT
  • Senmova bilda eligo: MS_STATIC_IMAGE
  • Video Por Linukso (V4L) kapto (Linukso): MS_V4L
  • Video Por Linukso 2 (V4L2) kapto (Linukso): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) kapto (Vindozo)
  • Video4windows (DirectShow) kapto (Windows CE)
  • Capto de Video Por Vindozo (vfw) (Vindozo)
  • XV-reproduktado (Linukso)

Videokodado/malkodado

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Neĝo: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (nur malĉifrilo): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Videoprilaborado

  • jpeg momentfoto
  • Konvertilo de pikselaj formatoj: MS_PIX_CONV
  • Regrandigilo
  • Aliaj filtriloj
  • Interŝanĝo de datumblokoj inter fadenoj: MS_ITC_SOURCE, MS_ITC_SINK
  • Kolektante blokojn de datumoj de pluraj enigaĵoj al ununura eligo: MS_JOIN
  • RTP-ricevo/transsendo: MS_RTP_SEND, MS_RTP_RECV
  • Kopiante enigajn datumojn al pluraj eliroj: MS_TEE
  • Finita ŝarĝo: MS_VOID_SINK
  • Silentu Fonto: MS_VOID_SOURCE

Kromaĵoj

Sonfiltriloj

  • AMR-NB-kodilo/malĉifrilo
  • G.729 kodilo/malĉifrilo
  • iLBC-kodilo/malĉifrilo
  • SILK-kodilo/malkodilo

    Videofiltriloj

  • H.264 programara kodilo
  • H.264 V4L2 aparataro akcelis kodilon/malĉifrilon

Post mallonga priskribo de la filtrilo, la nomo de la tipo estas montrata, kiu estas uzata dum kreado de nova kazo de ĉi tiu filtrilo. En kio sekvas, ni raportos al ĉi tiu listo.

Instalado sub Linukso Ubuntu

Nun ni instalos la amaskomunikilaron streamer en la komputilo kaj konstruos nian unuan aplikaĵon kun ĝi.

Instali Mediastremer2 sur komputilo aŭ virtuala maŝino kuranta Ubuntu ne postulas specialajn kapablojn. Ĉi tie kaj malsupre, la simbolo "$" indikos la ŝelpromeson por enigi komandojn. Tiuj. se en la listo vi vidas ĉi tiun simbolon ĉe la komenco de la linio, tiam ĉi tiu estas la linio en kiu ordonoj montriĝas ekzekutitaj en la terminalo.

Oni supozas, ke dum la paŝoj en ĉi tiu artikolo, via komputilo havas aliron al Interreto.

Instalante la libmediastremer-dev-pakaĵon

Lanĉu la terminalon kaj tajpu la komandon:

$ sudo apt-get update

Oni petos al vi pasvorton por fari ŝanĝojn, enigu ĝin kaj la pakaĵa administranto ĝisdatigos siajn datumbazojn. Post tio, vi devas kuri:

$ sudo apt-get install libmediastreamer-dev

La necesaj dependecpakaĵoj kaj la amaskomunikilara streamer-biblioteko mem estos aŭtomate elŝutitaj kaj instalitaj.

La totala grandeco de la elŝutitaj dependecaj deb-pakaĵoj estos proksimume 35 MB. Detaloj pri la instalita pako troveblas per la komando:

$ dpkg -s libmediastreamer-dev

Ekzemplo de respondo:

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/

Instalado de evoluiloj

Instalu la C-kompililon kaj ĝiajn akompanajn ilojn:

$ sudo apt-get install gcc

Ni kontrolas la rezulton pridemandante la version de la kompililo:

$ gcc --version

La respondo devus esti io kiel ĉi tio:

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.

Konstruado kaj Kurado de la Prova Apliko

Ni kreas en hejmo dosierujo por niaj lernilaj projektoj, ni nomu ĝin mstutorial:

$ mkdir ~/mstutorial

Uzu vian plej ŝatatan tekstredaktilon kaj kreu C programdosieron nomitan mstest.c kun la jena enhavo:

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

Ĝi pravigas la amaskomunikilaron, presas saluton kaj eliras.

Konservu la dosieron kaj kompilu la testan aplikaĵon per la komando:

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

Notu ke la linio

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

enfermitaj inter citiloj, kiuj troviĝas sur la klavaro samloke kiel la litero "Ё".

Se la dosiero ne enhavas erarojn, tiam post kompilo dosiero aperos en la dosierujo mstest. Ni komencas la programon:

$ ./mstest

La rezulto estos tia:

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.

En ĉi tiu listo, ni vidas la erarmesaĝojn, kiujn la biblioteko ALSA montras, ĝi estas uzata por kontroli la sonkarton. La programistoj de la amaskomunikila streamer mem kredas, ke tio estas normala. En ĉi tiu kazo, ni kontraŭvole konsentas kun ili.

Nun ni ĉiuj estas pretaj labori kun la amaskomunikilara streamer. Ni instalis la amaskomunikilaran streamer-bibliotekon, la kompililon, kaj uzante provan aplikaĵon, ni kontrolis, ke la iloj estas agorditaj kaj la amaskomunikilara streamer pravaloriĝas sukcese.

Poste artikolo ni kreos aplikaĵon, kiu kunvenos kaj funkciigos la prilaboradon de sonsignalo en ĉeno de pluraj filtriloj.

fonto: www.habr.com