Meneroka enjin Mediastreamer2 VoIP. Bahagian 1

Bahan artikel diambil dari saya saluran zen.

Pengenalan

Artikel ini ialah permulaan siri artikel tentang pemprosesan media masa nyata menggunakan enjin Mediastreamer2. Pembentangan akan melibatkan kemahiran minimum bekerja di terminal Linux dan pengaturcaraan dalam bahasa C.

Mediastreamer2 ialah enjin VoIP di sebalik projek telefon voip perisian sumber terbuka yang popular. telefon. Dalam Linphone Mediastreamer2 melaksanakan semua fungsi yang berkaitan dengan bunyi dan video. Senarai terperinci ciri enjin boleh dilihat pada halaman Mediastreamer ini. Kod sumber ada di sini: GitLab.

Selanjutnya dalam teks, untuk kemudahan, bukannya perkataan Mediastreamer2 kami akan menggunakan notasi Rusianya: "media streamer".

Sejarah penciptaannya tidak sepenuhnya jelas, tetapi berdasarkan kod sumbernya, ia sebelum ini menggunakan perpustakaan glib, yang, seolah-olah, membayangkan kemungkinan hubungan jauh dengan GStreamer. Berbanding dengan mana penstrim media kelihatan lebih ringan. Versi pertama Linphone muncul pada tahun 2001, jadi pada masa ini penstrim media wujud dan berkembang selama hampir 20 tahun.

Di tengah-tengah penstrim media ialah seni bina yang dipanggil "Aliran data" (aliran data). Contoh seni bina sedemikian ditunjukkan dalam rajah di bawah.

Meneroka enjin Mediastreamer2 VoIP. Bahagian 1

Dalam seni bina ini, algoritma pemprosesan data ditentukan bukan oleh kod program, tetapi oleh skema (graf) untuk menyambung fungsi yang boleh diatur dalam sebarang susunan. Fungsi ini dipanggil penapis.

Seni bina ini memungkinkan untuk melaksanakan fungsi pemprosesan media dalam bentuk satu set penapis yang disambungkan kepada skim pemprosesan dan penghantaran trafik RTP telefon VoIP.

Keupayaan untuk menggabungkan penapis ke dalam skema sewenang-wenangnya, pembangunan penapis baharu yang mudah, pelaksanaan penstrim media sebagai perpustakaan berasingan bebas, membolehkan ia digunakan dalam projek lain. Lebih-lebih lagi, projek itu boleh berada dalam bidang VoIP, kerana ia mungkin untuk menambah penapis yang dibuat oleh diri sendiri.

Pustaka penapis yang dibekalkan secara lalai agak kaya dan, seperti yang telah disebutkan, boleh dilanjutkan dengan penapis reka bentuk kami sendiri. Tetapi pertama-tama, mari kita terangkan penapis siap sedia yang disertakan dengan penstrim media. Berikut adalah senarai mereka:

Penapis bunyi

Tangkapan audio dan main balik

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Bunyi asli Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Perkhidmatan Barisan Audio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Perkhidmatan Unit Audio (Mac OS X)
  • Seni (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Pemain fail (fail mentah/wav/pcap) (Linux): MS_FILE_PLAYER
  • Pemain fail (fail mentah/wav) (Windows): MS_WINSND_READ
  • Tulis ke fail (fail wav) (Linux): MS_FILE_REC
  • Tulis ke fail (fail wav) (Windows): MS_WINSND_WRITE
  • Unit Audio Mac (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
  • Bunyi Windows (Windows)

Pengekodan/penyahkodan audio

  • Undang-undang G.711: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 Β΅-undang: 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
  • PCM Linear: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Pemprosesan bunyi

  • Penukaran saluran (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Persidangan: MS_CONF
  • Penjana DTMF: MS_DTMF_GEN
  • Pembatalan gema (speex): MS_SPEEX_EC
  • Penyama: MS_EQUALIZER
  • Pengadun: MS_MIXER
  • Pemampas Kehilangan Paket (PLC): MS_GENERIC_PLC
  • Pensampel semula: MS_RESAMPLE
  • Pengesan nada: MS_TONE_DETECTOR
  • Kawalan kelantangan dan pengukuran tahap isyarat: MS_VOLUME

Penapis video

Tangkapan dan main balik video

  • tangkapan android
  • main balik android
  • Tangkapan Yayasan AV (iOS)
  • Main balik AV Foundation (iOS)
  • DirectShow Capture (Windows)
  • Main semula DrawDib (Windows)
  • Main balik luaran - Menghantar video ke lapisan atas
  • Main balik GLX (Linux): MS_GLXVIDEO
  • Mire - Gambar bergerak sintetik: MS_MIRE
  • Main balik OpenGL (Mac OS X)
  • Main balik OpenGL ES2 (Android)
  • Quicktime Capture (Mac OS X)
  • Main balik SDL: MS_SDL_OUT
  • Output imej statik: MS_STATIC_IMAGE
  • Tangkapan Video Untuk Linux (V4L) (Linux): MS_V4L
  • Tangkapan Video Untuk Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Tangkapan Video4windows (DirectShow) (Windows)
  • Tangkapan Video4windows (DirectShow) (Windows CE)
  • Tangkapan Video Untuk Windows (vfw) (Windows)
  • Main semula XV (Linux)

Pengekodan/penyahkodan video

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

Pemprosesan video

  • gambar jpeg
  • Penukar format piksel: MS_PIX_CONV
  • Penukar semula
  • Penapis lain
  • Pertukaran blok data antara utas: MS_ITC_SOURCE, MS_ITC_SINK
  • Mengumpul blok data daripada berbilang input kepada satu output: MS_JOIN
  • RTP terima/hantar: MS_RTP_SEND, MS_RTP_RECV
  • Menyalin data input ke berbilang output: MS_TEE
  • Muatan ditamatkan: MS_VOID_SINK
  • Senyapkan Sumber: MS_VOID_SOURCE

Pemalam

Penapis bunyi

  • Pengekod/penyahkod AMR-NB
  • pengekod/penyahkod G.729
  • pengekod/penyahkod iLBC
  • Pengekod/penyahkod SUTERA

    Penapis video

  • Pengekod perisian H.264
  • Pengekod/penyahkod dipercepatkan perkakasan H.264 V4L2

Selepas penerangan ringkas tentang penapis, nama jenis ditunjukkan, yang digunakan semasa membuat tika baharu penapis ini. Dalam perkara berikut, kami akan merujuk kepada senarai ini.

Pemasangan di bawah Linux Ubuntu

Sekarang kami akan memasang penstrim media pada komputer dan membina aplikasi pertama kami dengannya.

Memasang Mediastremer2 pada komputer atau mesin maya yang menjalankan Ubuntu tidak memerlukan sebarang kemahiran khas. Di sini dan di bawah, simbol "$" akan menandakan gesaan shell untuk memasukkan arahan. Itu. jika dalam penyenaraian anda melihat simbol ini pada permulaan baris, maka ini adalah baris di mana arahan ditunjukkan untuk dilaksanakan dalam terminal.

Diandaikan bahawa semasa langkah dalam artikel ini, komputer anda mempunyai akses kepada Internet.

Memasang pakej libmediastremer-dev

Lancarkan terminal dan taip arahan:

$ sudo apt-get update

Anda akan diminta untuk kata laluan untuk membuat perubahan, masukkannya dan pengurus pakej akan mengemas kini pangkalan datanya. Selepas itu, anda perlu menjalankan:

$ sudo apt-get install libmediastreamer-dev

Pakej pergantungan yang diperlukan dan pustaka penstrim media itu sendiri akan dimuat turun dan dipasang secara automatik.

Jumlah saiz pakej deb pergantungan yang dimuat turun ialah kira-kira 35 MB. Butiran tentang pakej yang dipasang boleh didapati dengan arahan:

$ dpkg -s libmediastreamer-dev

Contoh jawapan:

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/

Memasang alat pembangunan

Pasang pengkompil C dan alat yang disertakan:

$ sudo apt-get install gcc

Kami menyemak hasilnya dengan menanyakan versi pengkompil:

$ gcc --version

Jawapannya sepatutnya seperti ini:

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.

Membina dan Menjalankan Aplikasi Percubaan

Kami mencipta dalam rumah folder untuk projek tutorial kami, mari kita panggilnya mstutorial:

$ mkdir ~/mstutorial

Gunakan editor teks kegemaran anda dan buat fail program C yang dipanggil mstest.c dengan kandungan berikut:

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

Ia memulakan penstrim media, mencetak ucapan dan keluar.

Simpan fail dan susun aplikasi ujian dengan arahan:

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

Perhatikan bahawa baris

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

disertakan dalam tanda petikan, yang terletak pada papan kekunci di tempat yang sama dengan huruf "Ё".

Jika fail tidak mengandungi ralat, maka selepas penyusunan fail akan muncul dalam direktori mstest. Kami memulakan program:

$ ./mstest

Hasilnya akan menjadi seperti ini:

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.

Dalam penyenaraian ini, kami melihat mesej ralat yang dipaparkan oleh perpustakaan ALSA, ia digunakan untuk mengawal kad bunyi. Pembangun penstrim media sendiri percaya bahawa ini adalah perkara biasa. Dalam kes ini, kami dengan berat hati bersetuju dengan mereka.

Kini kami bersedia untuk bekerja dengan penstrim media. Kami telah memasang pustaka penstrim media, alat penyusunan dan menggunakan aplikasi percubaan, mengesahkan bahawa alat tersebut dikonfigurasikan dan penstrim media berjaya dimulakan.

Seterusnya artikel kami akan mencipta aplikasi yang akan memasang dan menjalankan pemprosesan isyarat audio dalam rangkaian beberapa penapis.

Sumber: www.habr.com