Utforsker Mediastreamer2 VoIP-motoren. Del 1

Stoffet til artikkelen er hentet fra min zen-kanal.

Innledning

Denne artikkelen er begynnelsen på en serie artikler om sanntids mediebehandling ved bruk av Mediastreamer2-motoren. Presentasjonen vil innebære minimumsferdighetene til å jobbe i Linux-terminalen og programmere i C-språket.

Mediastreamer2 er VoIP-motoren bak det populære voip-telefonprosjektet med åpen kildekode. telefon. I Linphone implementerer Mediastreamer2 alle funksjoner knyttet til lyd og video. En detaljert liste over motorfunksjoner kan sees på denne Mediastreamer-siden. Kildekoden er her: GitLab.

Videre i teksten, for enkelhets skyld, i stedet for ordet Mediastreamer2 vil vi bruke den russiske notasjonen: "mediastreamer".

Historien om opprettelsen er ikke helt klar, men å dømme etter kildekoden, brukte den tidligere biblioteket glib, som liksom antyder et mulig fjernt forhold til GStreamer. I sammenligning med hvilken ser mediastreameren mer lett ut. Den første versjonen av Linphone dukket opp i 2001, så for øyeblikket eksisterer og utvikler mediastreameren i nesten 20 år.

Kjernen i mediastreameren er en arkitektur som kalles "Dataflyt" (dataflyt). Et eksempel på en slik arkitektur er vist i figuren under.

Utforsker Mediastreamer2 VoIP-motoren. Del 1

I denne arkitekturen er databehandlingsalgoritmen ikke spesifisert av en programkode, men av et skjema (graf) for å koble funksjoner som kan ordnes i hvilken som helst rekkefølge. Disse funksjonene kalles filtre.

Denne arkitekturen gjør det mulig å implementere mediebehandlingsfunksjonaliteten i form av et sett med filtre koblet til VoIP-telefonens RTP-trafikkbehandlings- og overføringsskjema.

Evnen til å kombinere filtre til vilkårlige ordninger, den enkle utviklingen av nye filtre, implementeringen av mediastreameren som et uavhengig separat bibliotek, gjør at den kan brukes i andre prosjekter. Dessuten kan prosjektet være innen VoIP, siden det er mulig å legge til filtre laget av seg selv.

Filterbiblioteket som leveres som standard er ganske rikt og, som allerede nevnt, kan det utvides med filtre av vårt eget design. Men først, la oss beskrive de ferdige filtrene som følger med mediestreameren. Her er listen deres:

Lydfiltre

Lydopptak og avspilling

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Innebygd lyd for 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)
  • Kunst (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Filspiller (raw/wav/pcap-filer) (Linux): MS_FILE_PLAYER
  • Filspiller (raw/wav-filer) (Windows): MS_WINSND_READ
  • Skriv til fil (wav-filer) (Linux): MS_FILE_REC
  • Skriv til fil (wav-filer) (Windows): MS_WINSND_WRITE
  • Mac-lydenhet (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-lyd (Windows)

Lydkoding/dekoding

  • G.711 a-lov: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-lov: 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
  • Lineær PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Lydbehandling

  • Kanalkonvertering (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferanse: MS_CONF
  • DTMF-generator: MS_DTMF_GEN
  • Ekkokansellering (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mikser: MS_MIXER
  • Pakketapskompensator (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Tonedetektor: MS_TONE_DETECTOR
  • Volumkontroll og signalnivåmåling: MS_VOLUME

Videofiltre

Videoopptak og avspilling

  • android-fangst
  • android avspilling
  • AV Foundation-opptak (iOS)
  • AV Foundation-avspilling (iOS)
  • DirectShow Capture (Windows)
  • DrawDib-avspilling (Windows)
  • Ekstern avspilling - Sender video til topplaget
  • GLX-avspilling (Linux): MS_GLXVIDEO
  • Mire - Syntetisk bevegelig bilde: MS_MIRE
  • OpenGL-avspilling (Mac OS X)
  • OpenGL ES2-avspilling (Android)
  • Quicktime Capture (Mac OS X)
  • SDL-avspilling: MS_SDL_OUT
  • Statisk bildeutgang: MS_STATIC_IMAGE
  • Videoopptak for Linux (V4L) (Linux): MS_V4L
  • Videoopptak for Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow)-opptak (Windows)
  • Video4windows (DirectShow)-opptak (Windows CE)
  • Videoopptak for Windows (vfw) (Windows)
  • XV-avspilling (Linux)

Videokoding/dekoding

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snø: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (kun dekoder): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Videobehandling

  • jpeg øyeblikksbilde
  • Pikselformatkonverter: MS_PIX_CONV
  • Resizer
  • Andre filtre
  • Utveksling av datablokker mellom tråder: MS_ITC_SOURCE, MS_ITC_SINK
  • Samle blokker med data fra flere innganger til en enkelt utgang: MS_JOIN
  • RTP mottak/overføring: MS_RTP_SEND, MS_RTP_RECV
  • Kopierer inndata til flere utganger: MS_TEE
  • Avsluttet belastning: MS_VOID_SINK
  • Stille Kilde: MS_VOID_SOURCE

Плагины

Lydfiltre

  • AMR-NB koder/dekoder
  • G.729 koder/dekoder
  • iLBC-koder/dekoder
  • SILK koder/dekoder

    Videofiltre

  • H.264 programvarekoder
  • H.264 V4L2 maskinvareakselerert koder/dekoder

Etter en kort beskrivelse av filteret vises navnet på typen, som brukes når du oppretter en ny forekomst av dette filteret. I det følgende vil vi referere til denne listen.

Installasjon under Linux Ubuntu

Nå skal vi installere mediastreameren på datamaskinen og bygge vår første applikasjon med den.

Å installere Mediastremer2 på en datamaskin eller virtuell maskin som kjører Ubuntu krever ingen spesielle ferdigheter. Her og nedenfor vil symbolet "$" betegne shell-ledeteksten for å legge inn kommandoer. De. hvis du i listen ser dette symbolet på begynnelsen av linjen, så er dette linjen der kommandoer vises til å bli utført i terminalen.

Det antas at datamaskinen din har tilgang til Internett under trinnene i denne artikkelen.

Installerer libmediastremer-dev-pakken

Start terminalen og skriv inn kommandoen:

$ sudo apt-get update

Du vil bli bedt om et passord for å gjøre endringer, skriv det inn og pakkebehandleren vil oppdatere sine databaser. Etter det må du kjøre:

$ sudo apt-get install libmediastreamer-dev

De nødvendige avhengighetspakkene og selve mediastreamerbiblioteket blir automatisk lastet ned og installert.

Den totale størrelsen på de nedlastede avhengighetsdeb-pakkene vil være omtrent 35 MB. Detaljer om den installerte pakken finner du med kommandoen:

$ dpkg -s libmediastreamer-dev

Eksempel på svar:

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/

Installere utviklingsverktøy

Installer C-kompilatoren og dens medfølgende verktøy:

$ sudo apt-get install gcc

Vi sjekker resultatet ved å spørre etter kompilatorversjonen:

$ gcc --version

Svaret bør være noe sånt som dette:

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.

Bygge og kjøre prøveapplikasjonen

Vi skaper i hjem mappe for opplæringsprosjektene våre, la oss kalle det mtutorial:

$ mkdir ~/mstutorial

Bruk din favoritt tekstredigerer og lag en C-programfil kalt mstest.c med følgende innhold:

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

Den initialiserer mediestreameren, skriver ut en hilsen og avslutter.

Lagre filen og kompiler testapplikasjonen med kommandoen:

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

Merk at linjen

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

omgitt av anførselstegn, som er plassert på tastaturet på samme sted som bokstaven "Ё".

Hvis filen ikke inneholder feil, vil en fil vises i katalogen etter kompilering mstest. Vi starter programmet:

$ ./mstest

Resultatet blir slik:

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.

I denne oppføringen ser vi feilmeldingene som ALSA-biblioteket viser, det brukes til å kontrollere lydkortet. Utviklerne av mediastreameren mener selv at dette er normalt. I dette tilfellet er vi motvillig enige med dem.

Nå er vi klare til å jobbe med mediastreameren. Vi har installert mediastreamer-biblioteket, kompileringsverktøyet, og ved hjelp av en prøveapplikasjon har vi bekreftet at verktøyene er konfigurert og at mediastreameren initialiseres.

Neste artikkel vi vil lage en applikasjon som vil sette sammen og kjøre behandlingen av et lydsignal i en kjede av flere filtre.

Kilde: www.habr.com