کاوش در موتور VoIP Mediastreamer2. قسمت 1

مطالب مقاله از من گرفته شده است کانال ذن.

معرفی

این مقاله آغاز مجموعه ای از مقالات در مورد پردازش رسانه در زمان واقعی با استفاده از موتور Mediastreamer2 است. این ارائه شامل حداقل مهارت های کار در ترمینال لینوکس و برنامه نویسی به زبان C خواهد بود.

Mediastreamer2 موتور VoIP پشت نرم افزار منبع باز محبوب پروژه تلفن voip است. تلفن. در Linphone Mediastreamer2 تمام عملکردهای مربوط به صدا و تصویر را پیاده سازی می کند. لیست مفصلی از ویژگی های موتور را می توان در این صفحه Mediastreamer مشاهده کرد. کد منبع اینجاست: گیتلب.

در ادامه متن، برای راحتی، به جای کلمه Mediastreamer2 از نماد روسی آن استفاده خواهیم کرد: "رسانه رسانه".

تاریخچه ایجاد آن کاملاً روشن نیست، اما با قضاوت بر اساس کد منبع آن، قبلاً از کتابخانه استفاده می کرد سلیس و چرب زبان، که، همانطور که بود، به یک رابطه دور احتمالی با GStreamer. در مقایسه با آن پخش کننده رسانه سبک تر به نظر می رسد. اولین نسخه Linphone در سال 2001 ظاهر شد، بنابراین در حال حاضر پخش کننده رسانه ای تقریباً 20 سال است که وجود دارد و توسعه می یابد.

در قلب استریمر رسانه، معماری به نام «جریان داده» (جریان داده) قرار دارد. نمونه ای از چنین معماری در شکل زیر نشان داده شده است.

کاوش در موتور VoIP Mediastreamer2. قسمت 1

در این معماری، الگوریتم پردازش داده نه توسط یک کد برنامه، بلکه توسط یک طرح (گراف) برای اتصال توابع مشخص می شود که می تواند به هر ترتیبی مرتب شود. این توابع فیلتر نامیده می شوند.

این معماری اجرای عملکرد پردازش رسانه را در قالب مجموعه ای از فیلترهای متصل به طرح پردازش و انتقال ترافیک RTP تلفن VoIP امکان پذیر می کند.

توانایی ترکیب فیلترها در طرح های دلخواه، توسعه ساده فیلترهای جدید، اجرای پخش کننده رسانه به عنوان یک کتابخانه مستقل مستقل، امکان استفاده از آن را در پروژه های دیگر فراهم می کند. علاوه بر این، پروژه می تواند در زمینه VoIP باشد، زیرا امکان افزودن فیلترهای ساخته شده توسط خود شخص وجود دارد.

کتابخانه فیلتر ارائه شده به طور پیش فرض کاملاً غنی است و همانطور که قبلاً ذکر شد، می توان آن را با فیلترهای طراحی خودمان گسترش داد. اما ابتدا اجازه دهید فیلترهای آماده ای که همراه با پخش کننده رسانه ارائه می شوند را شرح دهیم. در اینجا لیست آنها است:

فیلترهای صوتی

ضبط و پخش صدا

  • آلسا (لینوکس): MS_ALSA_WRITE، MS_ALSA_READ
  • صدای بومی اندروید (libmedia): MS_ANDROID_SOUND_WRITE، MS_ANDROID_SOUND_READ
  • سرویس صف صدا (Mac OS X): MS_AQ_WRITE، MS_AQ_READ
  • سرویس واحد صوتی (Mac OS X)
  • هنر (لینوکس): MS_ARTS_WRITE، MS_ARTS_READ
  • DirectSound (ویندوز): MS_WINSNDDS_WRITE، MS_WINSNDDS_READ
  • پخش کننده فایل (فایل های خام/wav/pcap) (لینوکس): MS_FILE_PLAYER
  • پخش کننده فایل (فایل های خام/wav) (ویندوز): MS_WINSND_READ
  • نوشتن در فایل (فایل های wav) (لینوکس): MS_FILE_REC
  • نوشتن در فایل (فایل های wav) (ویندوز): MS_WINSND_WRITE
  • واحد صوتی مک (Mac OS X)
  • MME (ویندوز)
  • OSS (Linux): MS_OSS_WRITE، MS_OSS_READ
  • PortAudio (Mac OS X)
  • PulseAudio (لینوکس): MS_PULSE_WRITE، MS_PULSE_READ
  • صدای ویندوز (ویندوز)

رمزگذاری / رمزگشایی صدا

  • G.711 a-law: MS_ALAW_DEC، MS_ALAW_ENC
  • G.711 μ-قانون: 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 خطی: MS_L16_ENC، MS_L16_DEC
  • سرعت: MS_SPEEX_ENC، MS_SPEEX_DEC

پردازش صدا

  • تبدیل کانال (مونو-> استریو، استریو-> مونو): MS_CHANNEL_ADAPTER
  • کنفرانس: MS_CONF
  • ژنراتور DTMF: MS_DTMF_GEN
  • لغو اکو (speex): MS_SPEEX_EC
  • اکولایزر: MS_EQUALIZER
  • میکسر: MS_MIXER
  • جبران کننده تلفات بسته (PLC): MS_GENERIC_PLC
  • نمونه گیری مجدد: MS_RESAMPLE
  • آشکارساز تن: MS_TONE_DETECTOR
  • کنترل صدا و اندازه گیری سطح سیگنال: MS_VOLUME

فیلترهای ویدیویی

فیلم برداری و پخش

  • ضبط اندروید
  • پخش اندروید
  • تصویربرداری بنیاد AV (iOS)
  • پخش AV Foundation (iOS)
  • DirectShow Capture (ویندوز)
  • پخش DrawDib (ویندوز)
  • پخش خارجی - ارسال ویدیو به لایه بالایی
  • پخش GLX (لینوکس): MS_GLXVIDEO
  • Mire - تصویر متحرک مصنوعی: MS_MIRE
  • پخش OpenGL (Mac OS X)
  • پخش OpenGL ES2 (اندروید)
  • Quicktime Capture (Mac OS X)
  • پخش SDL: MS_SDL_OUT
  • خروجی تصویر ثابت: MS_STATIC_IMAGE
  • فیلمبرداری برای لینوکس (V4L) (Linux): MS_V4L
  • ضبط ویدیو برای Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • ضبط Video4windows (DirectShow) (ویندوز)
  • ضبط Video4windows (DirectShow) (Windows CE)
  • فیلمبرداری برای ویندوز (vfw) (ویندوز)
  • پخش XV (لینوکس)

رمزگذاری / رمزگشایی ویدیو

  • H.263، H.263-1998، MP4V-ES، JPEG، MJPEG، برف: MS_MJPEG_DEC، MS_H263_ENC، MS_H263_DEC
  • H.264 (فقط رمزگشا): MS_H264_DEC
  • تئورا: MS_THEORA_ENC، MS_THEORA_DEC
  • VP8: MS_VP8_ENC، MS_VP8_DEC

پردازش ویدئو

  • عکس فوری jpeg
  • مبدل فرمت پیکسل: MS_PIX_CONV
  • تغییر اندازه
  • فیلترهای دیگر
  • تبادل بلوک های داده بین رشته ها: MS_ITC_SOURCE، MS_ITC_SINK
  • جمع آوری بلوک های داده از چندین ورودی به یک خروجی: MS_JOIN
  • دریافت/انتقال RTP: MS_RTP_SEND، MS_RTP_RECV
  • کپی کردن داده های ورودی در خروجی های متعدد: MS_TEE
  • بار پایان یافته: MS_VOID_SINK
  • منبع سکوت: MS_VOID_SOURCE

پلاگین ها

فیلترهای صوتی

  • رمزگذار/رمزگشا AMR-NB
  • رمزگذار/رمزگشا G.729
  • رمزگذار/رمزگشا iLBC
  • رمزگذار/رمزگشا SILK

    فیلترهای ویدیویی

  • انکودر نرم افزار H.264
  • رمزگذار/رمزگشای سخت افزاری H.264 V4L2

پس از توضیح کوتاهی در مورد فیلتر، نام نوع نمایش داده می شود که هنگام ایجاد یک نمونه جدید از این فیلتر استفاده می شود. در ادامه به این لیست اشاره می کنیم.

نصب تحت لینوکس اوبونتو

حالا مدیا استریمر را روی کامپیوتر نصب می کنیم و اولین اپلیکیشن خود را با آن می سازیم.

نصب Mediastremer2 بر روی یک کامپیوتر یا ماشین مجازی که اوبونتو را اجرا می کند نیازی به مهارت خاصی ندارد. در اینجا و در زیر، نماد "$" نشان دهنده اعلان پوسته برای وارد کردن دستورات است. آن ها اگر در لیست این نماد را در ابتدای خط مشاهده کردید، این خطی است که در آن دستورات در ترمینال اجرا می شوند.

فرض بر این است که در طی مراحل این مقاله، کامپیوتر شما به اینترنت دسترسی دارد.

در حال نصب بسته libmediastremer-dev

ترمینال را راه اندازی کنید و دستور را تایپ کنید:

$ sudo apt-get update

از شما یک رمز عبور برای ایجاد تغییرات خواسته می شود، آن را وارد کنید و مدیر بسته پایگاه داده های آن را به روز می کند. پس از آن، باید اجرا کنید:

$ sudo apt-get install libmediastreamer-dev

بسته های وابستگی لازم و خود کتابخانه پخش کننده رسانه به طور خودکار دانلود و نصب می شوند.

حجم کل بسته های وابستگی دانلود شده تقریباً 35 مگابایت خواهد بود. جزئیات مربوط به بسته نصب شده را می توان با دستور پیدا کرد:

$ dpkg -s libmediastreamer-dev

نمونه پاسخ:

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/

نصب ابزارهای توسعه

کامپایلر C و ابزارهای همراه آن را نصب کنید:

$ sudo apt-get install gcc

ما نتیجه را با درخواست نسخه کامپایلر بررسی می کنیم:

$ gcc --version

پاسخ باید چیزی شبیه به این باشد:

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.

ساخت و اجرای برنامه آزمایشی

ما ایجاد می کنیم خانه پوشه پروژه های آموزشی ما، بیایید آن را صدا کنیم آموزشی:

$ mkdir ~/mstutorial

از ویرایشگر متن مورد علاقه خود استفاده کنید و یک فایل برنامه C به نام ایجاد کنید mstest.c با محتوای زیر:

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

پخش کننده رسانه را مقدار دهی اولیه می کند، یک تبریک چاپ می کند و از آن خارج می شود.

فایل را ذخیره کرده و برنامه آزمایشی را با دستور کامپایل کنید:

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

توجه داشته باشید که خط

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

محصور در علامت نقل قول، که روی صفحه کلید در همان محل حرف "Ё" قرار دارد.

اگر فایل حاوی خطا نباشد، پس از کامپایل یک فایل در دایرکتوری ظاهر می شود mstest. برنامه را شروع می کنیم:

$ ./mstest

نتیجه به این صورت خواهد بود:

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.

در این لیست، پیام های خطایی را می بینیم که کتابخانه ALSA نمایش می دهد، برای کنترل کارت صدا استفاده می شود. خود توسعه دهندگان پخش کننده رسانه معتقدند که این طبیعی است. در این مورد، ما با اکراه با آنها موافقیم.

اکنون همه ما آماده کار با پخش کننده رسانه هستیم. ما کتابخانه پخش کننده رسانه، ابزار کامپایل را نصب کرده ایم و با استفاده از یک برنامه آزمایشی، تأیید کردیم که ابزارها پیکربندی شده اند و پخش کننده رسانه با موفقیت مقداردهی اولیه می شود.

بعد مقاله ما برنامه ای ایجاد خواهیم کرد که پردازش سیگنال صوتی را در زنجیره ای از چندین فیلتر جمع آوری و اجرا می کند.

منبع: www.habr.com