Vi utforskar VoIP-motorn Mediastreamer2. Del 1

Artikelmaterialet Àr hÀmtat frÄn min Zen-kanal.

Introduktion

Den hÀr artikeln Àr början pÄ en serie artiklar om realtidsbehandling av mediadata med hjÀlp av motoren Mediastreamer2. Under framstÀllningen kommer minimala fÀrdigheter i Linux-terminal och programmering i C att anvÀndas.

Mediastreamer2 Àr en VoIP-motor som ligger till grund för det populÀra öppen kÀllkodsprojektet för programvaruvoip-telefonen. Linphone. I Linphone implementerar Mediastreamer2 alla funktioner relaterade till ljud och video. En detaljerad lista över motorens möjligheter kan ses pÄ den hÀr sidan Mediastreamer. KÀllkoden finns hÀr: GitLab.

För att underlĂ€tta kommer vi i texten att anvĂ€nda den ryska notationen för Mediastreamer2: Â«ĐŒĐ”ĐŽĐžĐ°ŃŃ‚Ń€ĐžĐŒĐ”Ń€Â».

Historien om dess skapande Àr inte helt tydlig, men enligt dess kÀllkod anvÀnde den tidigare biblioteket Glib, vilket antyder en potentiell avlÀgsen slÀktskap med GStreamer. JÀmfört med det ser mediastreamern mer lÀttviktig ut. Den första versionen av Linphone slÀpptes 2001, sÄ just nu har mediastreamern funnits och utvecklats i nÀstan 20 Är.

I grunden för mediastreamern ligger en arkitektur som kallas "Data flow" (datatström). Ett exempel pÄ en sÄdan arkitektur visas i bilden nedan.

Vi utforskar VoIP-motorn Mediastreamer2. Del 1

I denna arkitektur definieras algoritmen för databehandling inte av programkod, utan av en schema (graf) som kopplar samman funktioner, som kan ordnas i valfri ordning. Dessa funktioner kallas filter.

Denna arkitektur gör det möjligt att implementera funktionaliteten för mediahantering som en uppsÀttning filter som kopplas ihop i ett schema för bearbetning och överföring av RTP-trafik till VoIP-telefonen.

Möjligheten att koppla filter i godtyckliga scheman, enkel utveckling av nya filter och implementeringen av mediastreamern som ett fristÄende, separat bibliotek möjliggör dess anvÀndning i andra projekt. Dessutom kan projektet vara inom VoIP, eftersom det finns möjligheter att lÀgga till filter som du sjÀlv har skapat.

Det förinstallerade filterbiblioteket Àr ganska omfattande och som redan nÀmnts kan det utvidgas med filter av egen utveckling. Men först ska vi beskriva de fÀrdiga filter som levereras tillsammans med mediastreamern. HÀr Àr deras lista:

Ljudfilter

Inspelning och uppspelning av ljud

  • 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
  • Filspelare för filer (raw/wav/pcap-filer) (Linux): MS_FILE_PLAYER
  • Filspelare för filer (raw/wav-filer) (Windows): MS_WINSND_READ
  • Skriv till fil (wav-filer) (Linux): MS_FILE_REC
  • Skriv till fil (wav-filer) (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-ljud (Windows)

Kodning/decodning av ljud

  • G.711 a-law: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 ”-law: 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
  • LinjĂ€ra PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Ljudbehandling

  • Kanalkonvertering (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferens: MS_CONF
  • DTMF-generator: MS_DTMF_GEN
  • EkkodĂ€mpning (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mixer: MS_MIXER
  • Pakettapp kompensator (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Ton-detektor: MS_TONE_DETECTOR
  • Volymkontroll och signalnivĂ„mĂ€tning: MS_VOLUME

Videofilter

VideofÄngst och -uppspelning

  • Android-fĂ„ngst
  • Android-uppspelning
  • AV Foundation-fĂ„ngst (iOS)
  • AV Foundation-uppspelning (iOS)
  • DirectShow-fĂ„ngst (Windows)
  • DrawDib-uppspelning (Windows)
  • Extern uppspelning – Skicka video till hög nivĂ„
  • GLX-uppspelning (Linux): MS_GLXVIDEO
  • Mire – Syntetisk rörlig bild: MS_MIRE
  • OpenGL-uppspelning (Mac OS X)
  • OpenGL ES2-uppspelning (Android)
  • Quicktime-fĂ„ngst (Mac OS X)
  • SDL-uppspelning: MS_SDL_OUT
  • Utdata av statiska bilder: MS_STATIC_IMAGE
  • Video For Linux (V4L) fĂ„ngst (Linux): MS_V4L
  • Video For Linux 2 (V4L2) fĂ„ngst (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) fĂ„ngst (Windows)
  • Video4windows (DirectShow) fĂ„ngst (Windows CE)
  • Video For Windows (vfw) fĂ„ngst (Windows)
  • XV-uppspelning (Linux)

Kodning/decodning av video

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snow: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (endast decoder): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Videobehandling

  • JPEG snapshot
  • Pixelformatkonverterare: MS_PIX_CONV
  • Resizer
  • Andra filter
  • Byte av datablok mellan trĂ„dar: MS_ITC_SOURCE, MS_ITC_SINK
  • Samla datablok frĂ„n flera ingĂ„ngar till en utgĂ„ng: MS_JOIN
  • RTP mottagning/överföring: MS_RTP_SEND, MS_RTP_RECV
  • Kopiera ingĂ„ngsdata till flera utgĂ„ngar: MS_TEE
  • Konsistent belastning: MS_VOID_SINK
  • TysthetskĂ€lla: MS_VOID_SOURCE

Plugins

Ljudfilter

  • AMR-NB kodare/decoder
  • G.729 kodare/decoder
  • iLBC kodare/decoder
  • SILK kodare/decoder

    Videofilter

  • H.264 programkodare
  • H.264 V4L2 kodare/decoder med hĂ„rdvaruacceleration

Efter en kort beskrivning av filtret visas typnamnet som anvÀnds för att skapa en ny instans av detta filter. I fortsÀttningen kommer vi att hÀnvisa till den hÀr listan.

Installation pÄ Linux Ubuntu

Nu kommer vi att installera mediastreamern pÄ datorn och bygga vÄr första applikation med den.

Installationen av Mediastremer2 pĂ„ datorn eller virtuella maskinen som kör Ubuntu krĂ€ver inga speciella fĂ€rdigheter. HĂ€r och framĂ„t kommer vi att anvĂ€nda tecknet „$” för att beteckna kommandotolken för inmatning av kommandon. D.v.s. om du ser detta tecken i början av en rad i listan, betyder det att det Ă€r en rad som visar kommandon som ska köras i terminalen.

Det antas att din dator har tillgÄng till Internet under genomförandet av ÄtgÀrderna som beskrivs i denna artikel.

Installation av paketet libmediastremer-dev

Öppna terminalen och skriv in kommandot:

$ sudo apt-get update

Du kommer att bli ombedd att ange ett lösenord för att göra Àndringar, ange det och pakethanteraren kommer att uppdatera sina databaser. Efter detta mÄste du köra:

$ sudo apt-get install libmediastreamer-dev

NödvÀndiga beroendepaket och sjÀlva mediastreamerbiblioteket kommer automatiskt att laddas ner och installeras.

Den totala storleken pÄ de nedladdade deb-baserade beroendepaketen kommer att vara ungefÀr 35 MB. Detaljer om den installerade paketet kan fÄs med kommandot:

$ dpkg -s libmediastreamer-dev

Exempel pÄ svar:

Paket: libmediastreamer-dev
Status: installerat ok installerat
Prioritet: valfri
Avsnitt: libdevel
Installerad storlek: 244
UnderhÄllare: Ubuntu Developers 
Arkitektur: amd64
KĂ€lla: linphone
Version: 3.6.1-2.5
Beroenden: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Beskrivning: Linphone webbtelefonens mediebibliotek - utvecklingsfiler
Linphone Àr en ljud- och video-internettelefon som anvÀnder SIP-protokollet.
Den har ett GTK+ och konsolgrÀnssnitt, inkluderar en stor variation av ljud- och videokodekar, och erbjuder IM-funktioner.
.
Detta paket innehÄller utvecklingsbiblioteken för hantering av mediaoperationer.
Ursprunglig underhÄllare: Debian VoIP Team 
Startsida: http://www.linphone.org/

Installation av utvecklingsverktyg

Vi installerar C-kompilatorn och tillhörande verktyg:

$ sudo apt-get install gcc

Kontrollera resultatet genom att begÀra kompilatorns version:

$ gcc --version

Svaret ska vara ungefÀr sÄ hÀr:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Detta Àr fri programvara; se kÀllan för kopieringsvillkor. Det finns INGEN
garanti; inte ens för SALGBARHET eller LÄMPLIGHET FÖR ETT VISST SYFTE.

Bygg och kör en provapplikation

Skapa en home mapp för vÄra utbildningsprojekt, kalla den mstutorial:

$ mkdir ~/mstutorial

AnvÀnd din favorittextredigerare och skapa en C-programfil som heter mstest.c med följande innehÄll:

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

Det initierar mediastreamern, skriver ut ett vÀlkomnande och avslutar körningen.

Spara filen och kompilera testapplikationen med följande kommando:

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

Observera att raden

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

Àr innesluten i citationstecken, som finns pÄ tangentbordet dÀr bokstaven «Ё» ocksÄ finns.

Om filen inte innehÄller nÄgra fel, kommer en fil att skapas i katalogen efter kompileringen. mstest. Vi kör programmet:

$ .\/mstest

Resultatet kommer att se ut sÄ hÀr:

ALSA lib conf.c:4738:(snd_config_expand) OkÀnda parametrar 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Ogiltig CTL default:0
ortp-warning-Kunde inte fÀsta mixer till kort: Ogiltigt argument
ALSA lib conf.c:4738:(snd_config_expand) OkÀnda parametrar 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) OkÀnd PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) OkÀnda parametrar 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) OkÀnd PCM default:0
ortp-warning-Konstig, ljudkort HDA Intel PCH verkar inte vara kapabel till nÄgonting, försöker igen med plughw...
Mediastreamer Àr redo.

I detta utdrag ser vi felmeddelanden som ALSA-biblioteket ger, som anvÀnds för att styra ljudkortet. SjÀlva utvecklarna av mediastreamern anser att detta Àr normalt. I detta fall hÄller vi oss motvilligt med dem.

Nu har vi allt klart för att arbeta med mediastreamern. Vi har installerat mediastreamer-biblioteket, kompilering verktyget och genom ett testprogram kontrollerat att verktygen Àr instÀllda och att mediastreamern initieras framgÄngsrikt.

I nÀsta artikeln vi kommer att skapa en applikation som samlar in och kör ljudsignalbehandling i en kedja av flera filter.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster