Paggalugad sa Mediastreamer2 VoIP engine. Bahagi 1

Ang materyal ng artikulo ay kinuha mula sa aking zen channel.

Pagpapakilala

Ang artikulong ito ay simula ng isang serye ng mga artikulo tungkol sa real-time na pagpoproseso ng media gamit ang Mediastreamer2 engine. Kasama sa pagtatanghal ang pinakamababang kasanayan sa pagtatrabaho sa terminal ng Linux at programming sa wikang C.

Ang Mediastreamer2 ay ang VoIP engine sa likod ng sikat na open-source software na proyekto ng voip phone. telepono. Sa Linphone Mediastreamer2 ay nagpapatupad ng lahat ng mga function na may kaugnayan sa tunog at video. Ang isang detalyadong listahan ng mga tampok ng engine ay makikita sa pahina ng Mediastreamer na ito. Narito ang source code: GitLab.

Dagdag pa sa teksto, para sa kaginhawahan, sa halip na ang salitang Mediastreamer2 ay gagamitin namin ang Russian notation: "media streamer".

Ang kasaysayan ng paglikha nito ay hindi lubos na malinaw, ngunit sa paghusga sa source code nito, dati nitong ginamit ang library glib, na, kumbaga, ay nagpapahiwatig ng posibleng malayong relasyon sa GStreamer. Kung ihahambing sa kung saan ang media streamer ay mukhang mas magaan. Ang unang bersyon ng Linphone ay lumabas noong 2001, kaya sa ngayon ang media streamer ay umiiral at umuunlad sa loob ng halos 20 taon.

Sa gitna ng media streamer ay isang arkitektura na tinatawag na "Data flow" (data flow). Ang isang halimbawa ng naturang arkitektura ay ipinapakita sa figure sa ibaba.

Paggalugad sa Mediastreamer2 VoIP engine. Bahagi 1

Sa arkitektura na ito, ang algorithm ng pagproseso ng data ay tinukoy hindi ng isang code ng programa, ngunit sa pamamagitan ng isang scheme (graph) para sa pagkonekta ng mga function na maaaring ayusin sa anumang pagkakasunud-sunod. Ang mga function na ito ay tinatawag na mga filter.

Ginagawang posible ng arkitektura na ito na ipatupad ang paggana ng pagpoproseso ng media sa anyo ng isang hanay ng mga filter na konektado sa pamamaraan ng pagpoproseso at paghahatid ng trapiko ng VoIP phone RTP.

Ang kakayahang pagsamahin ang mga filter sa mga di-makatwirang scheme, ang simpleng pag-unlad ng mga bagong filter, ang pagpapatupad ng media streamer bilang isang independiyenteng hiwalay na library, ay nagpapahintulot na magamit ito sa iba pang mga proyekto. Bukod dito, ang proyekto ay maaaring nasa larangan ng VoIP, dahil posible na magdagdag ng mga filter na ginawa ng sarili.

Ang filter na library na ibinigay bilang default ay medyo mayaman at, gaya ng nabanggit na, ay maaaring palawigin gamit ang mga filter ng sarili nating disenyo. Ngunit una, ilarawan natin ang mga nakahandang filter na kasama ng media streamer. Narito ang kanilang listahan:

Mga filter ng tunog

Pagkuha ng audio at pag-playback

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • katutubong tunog ng Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Serbisyo ng Audio Queue (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Serbisyo ng Unit ng Audio (Mac OS X)
  • Sining (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • File player (raw/wav/pcap file) (Linux): MS_FILE_PLAYER
  • File player (raw/wav files) (Windows): MS_WINSND_READ
  • Sumulat sa file (wav file) (Linux): MS_FILE_REC
  • Sumulat sa file (wav file) (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)

Audio encoding/decoding

  • 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
  • Linear PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Pagproseso ng tunog

  • Conversion ng channel (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Kumperensya: MS_CONF
  • Tagabuo ng DTMF: MS_DTMF_GEN
  • Echo cancellation (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Panghalo: MS_MIXER
  • Packet Loss Compensator (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Detektor ng tono: MS_TONE_DETECTOR
  • Kontrol ng volume at pagsukat ng antas ng signal: MS_VOLUME

Mga filter ng video

Pagkuha ng video at pag-playback

  • pagkuha ng android
  • pag-playback ng android
  • AV Foundation capture (iOS)
  • AV Foundation playback (iOS)
  • DirectShow Capture (Windows)
  • DrawDib playback (Windows)
  • Panlabas na pag-playback - Pagpapadala ng video sa tuktok na layer
  • GLX playback (Linux): MS_GLXVIDEO
  • Mire - Sintetikong gumagalaw na larawan: MS_MIRE
  • OpenGL playback (Mac OS X)
  • OpenGL ES2 playback (Android)
  • Quicktime Capture (Mac OS X)
  • SDL playback: MS_SDL_OUT
  • Static na output ng imahe: MS_STATIC_IMAGE
  • Video Para sa Linux (V4L) capture (Linux): MS_V4L
  • Video Para sa Linux 2 (V4L2) capture (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) capture (Windows)
  • Video4windows (DirectShow) capture (Windows CE)
  • Video Para sa Windows (vfw) capture (Windows)
  • XV playback (Linux)

Pag-encode/pag-decode ng video

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

Pagproseso ng video

  • jpeg snapshot
  • Pixel format converter: MS_PIX_CONV
  • Resizer
  • Iba pang mga filter
  • Pagpapalitan ng mga bloke ng data sa pagitan ng mga thread: MS_ITC_SOURCE, MS_ITC_SINK
  • Pagkolekta ng mga bloke ng data mula sa maraming input hanggang sa isang output: MS_JOIN
  • RTP receive/transmit: MS_RTP_SEND, MS_RTP_RECV
  • Pagkopya ng data ng input sa maraming output: MS_TEE
  • Tinapos na pagkarga: MS_VOID_SINK
  • Pinagmulan ng Katahimikan: MS_VOID_SOURCE

Mga Plugin

Mga filter ng tunog

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

    Mga filter ng video

  • H.264 software encoder
  • H.264 V4L2 hardware accelerated encoder/decoder

Pagkatapos ng maikling paglalarawan ng filter, ipapakita ang pangalan ng uri, na ginagamit kapag gumagawa ng bagong instance ng filter na ito. Sa mga sumusunod, sasangguni kami sa listahang ito.

Pag-install sa ilalim ng Linux Ubuntu

Ngayon ay ii-install namin ang media streamer sa computer at bubuo ng aming unang application gamit ito.

Ang pag-install ng Mediastremer2 sa isang computer o virtual machine na tumatakbo sa Ubuntu ay hindi nangangailangan ng anumang espesyal na kasanayan. Dito at sa ibaba, ang simbolo na "$" ay magsasaad ng shell prompt para sa pagpasok ng mga command. Yung. kung sa listahan ay makikita mo ang simbolo na ito sa simula ng linya, ito ang linya kung saan ipinapakita ang mga command na ipapatupad sa terminal.

Ipinapalagay na sa mga hakbang sa artikulong ito, ang iyong computer ay may access sa Internet.

Pag-install ng libmediastremer-dev package

Ilunsad ang terminal at i-type ang command:

$ sudo apt-get update

Hihilingin sa iyo ang isang password upang gumawa ng mga pagbabago, ipasok ito at i-update ng manager ng package ang mga database nito. Pagkatapos nito, kailangan mong tumakbo:

$ sudo apt-get install libmediastreamer-dev

Ang mga kinakailangang dependency package at ang media streamer library mismo ay awtomatikong mada-download at mai-install.

Ang kabuuang laki ng mga na-download na dependency deb package ay humigit-kumulang 35 MB. Ang mga detalye tungkol sa naka-install na pakete ay matatagpuan sa command:

$ dpkg -s libmediastreamer-dev

Halimbawa ng sagot:

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/

Pag-install ng mga tool sa pag-unlad

I-install ang C compiler at ang mga kasamang tool nito:

$ sudo apt-get install gcc

Sinusuri namin ang resulta sa pamamagitan ng pagtatanong sa bersyon ng compiler:

$ gcc --version

Ang sagot ay dapat na ganito:

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.

Pagbuo at Pagpapatakbo ng Aplikasyon sa Pagsubok

Lumilikha kami sa bahay folder para sa aming mga proyekto sa tutorial, tawagan natin ito mstutorial:

$ mkdir ~/mstutorial

Gamitin ang iyong paboritong text editor at lumikha ng C program file na tinatawag mstest.c gamit ang sumusunod na nilalaman:

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

Sinisimulan nito ang media streamer, nagpi-print ng pagbati, at lumabas.

I-save ang file at i-compile ang test application gamit ang command:

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

Tandaan na ang linya

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

nakapaloob sa mga panipi, na matatagpuan sa keyboard sa parehong lugar ng titik na "Ё".

Kung ang file ay hindi naglalaman ng mga error, pagkatapos pagkatapos ng compilation isang file ay lilitaw sa direktoryo mstest. Sinimulan namin ang programa:

$ ./mstest

Ang resulta ay magiging ganito:

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.

Sa listahang ito, nakikita namin ang mga mensahe ng error na ipinapakita ng library ng ALSA, ginagamit ito upang kontrolin ang sound card. Ang mga nag-develop ng media streamer mismo ay naniniwala na ito ay normal. Sa kasong ito, atubili kaming sumasang-ayon sa kanila.

Ngayon ay handa na kaming magtrabaho kasama ang media streamer. Na-install namin ang library ng media streamer, ang compilation tool, at gamit ang isang trial na application, na-verify na ang mga tool ay na-configure at matagumpay na nasisimulan ang media streamer.

Susunod Artikulo gagawa kami ng isang application na magbubuo at magpapatakbo ng pagproseso ng isang audio signal sa isang chain ng ilang mga filter.

Pinagmulan: www.habr.com