Mediastreamer2 VoIP motorunu keşfetme. 1. Bölüm

Makalenin materyali benim zenci kanalı.

Giriş

Bu makale, Mediastreamer2 motorunu kullanarak gerçek zamanlı medya işleme hakkında bir dizi makalenin başlangıcıdır. Sunum, Linux terminalinde çalışmanın ve C dilinde programlamanın asgari becerilerini içerecektir.

Mediastreamer2, popüler açık kaynaklı yazılım voip telefon projesinin arkasındaki VoIP motorudur. Telefon. Linphone'da Mediastreamer2, ses ve video ile ilgili tüm işlevleri uygular. Motor özelliklerinin ayrıntılı bir listesi bu Mediastreamer sayfasında görülebilir. Kaynak kodu burada: GitLab.

Metinde ayrıca, kolaylık sağlamak için Mediastreamer2 kelimesi yerine Rusça gösterimini kullanacağız: "medya aktarıcı".

Yaratılış tarihi tam olarak net değil, ancak kaynak koduna bakılırsa, daha önce kütüphaneyi kullanıyordu. glib, olduğu gibi, olası bir uzak ilişkiye işaret ediyor Gstreamer. Medya aktarıcının daha hafif göründüğü ile karşılaştırıldığında. Linphone'un ilk sürümü 2001'de çıktı, bu nedenle şu anda medya yayıncısı var ve neredeyse 20 yıldır gelişiyor.

Medya aktarıcının kalbinde "Veri akışı" (veri akışı) adı verilen bir mimari bulunur. Böyle bir mimarinin bir örneği aşağıdaki şekilde gösterilmiştir.

Mediastreamer2 VoIP motorunu keşfetme. 1. Bölüm

Bu mimaride, veri işleme algoritması bir program koduyla değil, herhangi bir sırada düzenlenebilen bağlantı fonksiyonları için bir şema (grafik) ile belirlenir. Bu işlevlere filtre denir.

Bu mimari, medya işleme işlevselliğini, bir VoIP telefonunun RTP trafiğini işlemek ve iletmek için bir şemaya bağlı bir dizi filtre biçiminde uygulamaya koymayı mümkün kılar.

Filtreleri isteğe bağlı şemalarda birleştirme yeteneği, yeni filtrelerin basit bir şekilde geliştirilmesi, medya aktarıcının bağımsız ayrı bir kitaplık olarak uygulanması, diğer projelerde kullanılmasına izin verir. Ayrıca proje VoIP alanında olabilir, çünkü kendi yaptığı filtreleri eklemek mümkündür.

Varsayılan olarak sağlanan filtre kitaplığı oldukça zengindir ve daha önce de belirtildiği gibi kendi tasarımımız olan filtrelerle genişletilebilir. Ama önce, medya aktarıcıyla birlikte gelen hazır filtreleri açıklayalım. İşte onların listesi:

Ses filtreleri

Ses yakalama ve oynatma

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Android yerel sesi (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Ses Sırası Hizmeti (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Ses Birimi Hizmeti (Mac OS X)
  • Sanat (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Dosya oynatıcı (raw/wav/pcap dosyaları) (Linux): MS_FILE_PLAYER
  • Dosya oynatıcı (ham/wav dosyaları) (Windows): MS_WINSND_READ
  • Dosyaya yaz (wav dosyaları) (Linux): MS_FILE_REC
  • Dosyaya yaz (wav dosyaları) (Windows): MS_WINSND_WRITE
  • Mac Ses Birimi (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 Sesi (Windows)

Ses kodlama/kod çözme

  • G.711 a-yasası: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ yasası: 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
  • Doğrusal PCM: MS_L16_ENC, MS_L16_DEC
  • Konuşma: MS_SPEEX_ENC, MS_SPEEX_DEC

Ses işleme

  • Kanal dönüştürme (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferans: MS_CONF
  • DTMF Oluşturucu: MS_DTMF_GEN
  • Yankı iptali (speex): MS_SPEEX_EC
  • Ekolayzer: MS_EQUALIZER
  • Karıştırıcı: MS_MIXER
  • Paket Kaybı Dengeleyici (PLC): MS_GENERIC_PLC
  • Yeniden Örnekleyici: MS_RESAMPLE
  • Ton dedektörü: MS_TONE_DETECTOR
  • Ses kontrolü ve sinyal seviyesi ölçümü: MS_VOLUME

Video filtreleri

Video yakalama ve oynatma

  • android yakalama
  • android oynatma
  • AV Temel yakalama (iOS)
  • AV Foundation oynatma (iOS)
  • DirectShow Yakalama (Windows)
  • DrawDib oynatma (Windows)
  • Harici oynatma - Videoyu üst katmana gönderme
  • GLX oynatma (Linux): MS_GLXVIDEO
  • Mire - Sentetik hareketli resim: MS_MIRE
  • OpenGL oynatma (Mac OS X)
  • OpenGL ES2 oynatma (Android)
  • Quicktime Yakalama (Mac OS X)
  • SDL oynatma: MS_SDL_OUT
  • Statik görüntü çıkışı: MS_STATIC_IMAGE
  • Linux için Video (V4L) yakalama (Linux): MS_V4L
  • Linux 2 için Video (V4L2) yakalama (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) yakalama (Windows)
  • Video4windows (DirectShow) yakalama (Windows CE)
  • Windows için Video (vfw) yakalama (Windows)
  • XV oynatma (Linux)

Video kodlama/kod çözme

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Kar: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (yalnızca kod çözücü): MS_H264_DEC
  • Teora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

video işleme

  • anlık görüntü
  • Piksel biçimi dönüştürücü: MS_PIX_CONV
  • Boyutlandırıcı
  • Diğer filtreler
  • İş parçacıkları arasında veri bloklarının değişimi: MS_ITC_SOURCE, MS_ITC_SINK
  • Birden çok girdiden tek bir çıktıya veri blokları toplama: MS_JOIN
  • RTP alma/gönderme: MS_RTP_SEND, MS_RTP_RECV
  • Girdi verilerinin birden çok çıktıya kopyalanması: MS_TEE
  • Sonlandırılmış yük: MS_VOID_SINK
  • Sessiz Kaynak: MS_VOID_SOURCE

Eklentiler

Ses filtreleri

  • AMR-NB kodlayıcı/kod çözücü
  • G.729 kodlayıcı/kod çözücü
  • iLBC kodlayıcı/kod çözücü
  • İPEK kodlayıcı/kod çözücü

    Video filtreleri

  • H.264 yazılım kodlayıcı
  • H.264 V4L2 donanım hızlandırmalı kodlayıcı/kod çözücü

Filtrenin kısa bir açıklamasından sonra, bu filtrenin yeni bir örneğini oluştururken kullanılan türün adı gösterilir. Aşağıda, bu listeye atıfta bulunacağız.

Linux Ubuntu altında kurulum

Şimdi media streamer'ı bilgisayara yükleyeceğiz ve onunla ilk uygulamamızı oluşturacağız.

Mediastremer2'yi Ubuntu çalıştıran bir bilgisayar veya sanal makineye kurmak herhangi bir özel beceri gerektirmez. Burada ve aşağıda, "$" sembolü, komutları girmek için kabuk istemini gösterecektir. Onlar. listede satırın başında bu sembolü görüyorsanız, bu, terminalde yürütülecek komutların gösterildiği satırdır.

Bu makaledeki adımlar sırasında bilgisayarınızın İnternet erişimine sahip olduğu varsayılmaktadır.

libmediastremer-dev paketini yükleme

Terminali başlatın ve şu komutu yazın:

$ sudo apt-get update

Değişiklik yapmak için sizden bir şifre istenecek, şifreyi girin ve paket yöneticisi veritabanlarını güncelleyecektir. Bundan sonra, çalıştırmanız gerekir:

$ sudo apt-get install libmediastreamer-dev

Gerekli bağımlılık paketleri ve medya aktarıcı kitaplığının kendisi otomatik olarak indirilecek ve kurulacaktır.

İndirilen bağımlılık deb paketlerinin toplam boyutu yaklaşık 35 MB olacaktır. Kurulan paketle ilgili ayrıntılar şu komutla bulunabilir:

$ dpkg -s libmediastreamer-dev

Cevap örneği:

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/

Geliştirme araçlarını yükleme

C derleyicisini ve beraberindeki araçları kurun:

$ sudo apt-get install gcc

Derleyici sürümünü sorgulayarak sonucu kontrol ediyoruz:

$ gcc --version

Cevap şunun gibi bir şey olmalı:

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.

Deneme Uygulamasını Oluşturma ve Çalıştırma

içinde yaratıyoruz Anasayfa öğretici projelerimiz için klasör diyelim öğretici:

$ mkdir ~/mstutorial

Favori metin düzenleyicinizi kullanın ve adında bir C program dosyası oluşturun. mstest.c aşağıdaki içerikle:

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

Medya aktarıcıyı başlatır, bir selamlama yazdırır ve çıkar.

Dosyayı kaydedin ve test uygulamasını şu komutla derleyin:

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

satırın

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

klavyede "Ё" harfiyle aynı yerde bulunan tırnak işaretleri içine alınır.

Dosya hata içermiyorsa, derlemeden sonra dizinde bir dosya görünecektir. en çok. Programı başlatıyoruz:

$ ./mstest

Sonuç şöyle olacaktır:

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 listede ALSA kitaplığının görüntülediği hata mesajlarını görüyoruz, ses kartını kontrol etmek için kullanılıyor. Medya flama geliştiricilerinin kendileri bunun normal olduğuna inanıyor. Bu durumda, isteksizce onlarla aynı fikirdeyiz.

Artık hepimiz medya aktarıcıyla çalışmaya hazırız. Medya aktarıcı kitaplığını, derleme aracını kurduk ve bir deneme uygulaması kullanarak araçların yapılandırıldığını ve medya aktarıcının başarıyla başlatıldığını doğruladık.

Sonraki Makale bir ses sinyalinin işlenmesini birkaç filtreden oluşan bir zincirde toplayacak ve çalıştıracak bir uygulama yaratacağız.

Kaynak: habr.com