สำรวจเครื่องมือ Mediastreamer2 VoIP ส่วนที่ 1

เนื้อหาของบทความนำมาจากของฉัน ช่องเซน.

การแนะนำ

บทความนี้เป็นจุดเริ่มต้นของชุดบทความเกี่ยวกับการประมวลผลสื่อแบบเรียลไทม์โดยใช้เครื่องมือ Mediastreamer2 งานนำเสนอจะเกี่ยวข้องกับทักษะขั้นต่ำของการทำงานในเทอร์มินัล Linux และการเขียนโปรแกรมในภาษาซี

Mediastreamer2 เป็นเครื่องมือ VoIP ที่อยู่เบื้องหลังโครงการโทรศัพท์ voip ซอฟต์แวร์โอเพ่นซอร์สยอดนิยม ลินโฟน. ใน Linphone Mediastreamer2 ใช้ฟังก์ชันทั้งหมดที่เกี่ยวข้องกับเสียงและวิดีโอ รายการคุณลักษณะเครื่องยนต์โดยละเอียดสามารถดูได้ที่หน้า Mediastreamer นี้ ซอร์สโค้ดอยู่ที่นี่: GitLab.

นอกจากนี้ในข้อความ เพื่อความสะดวก แทนที่จะใช้คำว่า Mediastreamer2 เราจะใช้สัญกรณ์ภาษารัสเซีย: "media streamer"

ประวัติการสร้างไม่ชัดเจนนัก แต่เมื่อพิจารณาจากซอร์สโค้ดแล้ว ก่อนหน้านี้ใช้ห้องสมุด กะล่อนซึ่งเป็นนัยถึงความสัมพันธ์ที่ห่างเหินที่เป็นไปได้กับ GStreamer. เมื่อเปรียบเทียบกับลำแสงสื่อที่ดูเบากว่า Linphone รุ่นแรกปรากฏในปี 2001 ดังนั้นในขณะนี้สตรีมสื่อมีอยู่และพัฒนามาเกือบ 20 ปี

หัวใจของสตรีมมีเดียคือสถาปัตยกรรมที่เรียกว่า "ดาต้าโฟลว์" (ดาต้าโฟลว์) ตัวอย่างของสถาปัตยกรรมดังกล่าวแสดงในรูปด้านล่าง

สำรวจเครื่องมือ Mediastreamer2 VoIP ส่วนที่ 1

ในสถาปัตยกรรมนี้ อัลกอริธึมการประมวลผลข้อมูลไม่ได้ระบุโดยรหัสโปรแกรม แต่ระบุโดยโครงร่าง (กราฟ) สำหรับการเชื่อมต่อฟังก์ชันที่สามารถจัดเรียงตามลำดับใดก็ได้ ฟังก์ชันเหล่านี้เรียกว่าตัวกรอง

สถาปัตยกรรมนี้ทำให้สามารถใช้ฟังก์ชันการประมวลผลสื่อในรูปแบบของชุดตัวกรองที่เชื่อมต่อกับการประมวลผลทราฟฟิก RTP ของโทรศัพท์ VoIP และโครงร่างการส่งข้อมูล

ความสามารถในการรวมตัวกรองเข้ากับโครงร่างโดยพลการ, การพัฒนาตัวกรองใหม่อย่างง่าย, การใช้สตรีมมีเดียเป็นไลบรารีแยกต่างหากที่เป็นอิสระ ทำให้สามารถใช้ในโครงการอื่นได้ นอกจากนี้ โครงการสามารถอยู่ในสาขา VoIP เนื่องจากสามารถเพิ่มตัวกรองที่ทำขึ้นเอง

ไลบรารีตัวกรองที่ให้มาโดยค่าเริ่มต้นนั้นค่อนข้างสมบูรณ์ และดังที่ได้กล่าวไปแล้ว สามารถขยายได้ด้วยตัวกรองที่เราออกแบบเอง แต่ก่อนอื่น เรามาอธิบายตัวกรองสำเร็จรูปที่มาพร้อมกับสตรีมมีเดียกันก่อน นี่คือรายการของพวกเขา:

ตัวกรองเสียง

การจับและเล่นเสียง

  • Alsa (ลินุกซ์): MS_ALSA_WRITE, MS_ALSA_READ
  • เสียงพื้นเมืองของ Android (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
  • โปรแกรมเล่นไฟล์ (ไฟล์ raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • โปรแกรมเล่นไฟล์ (ไฟล์ raw/wav) (Windows): MS_WINSND_READ
  • เขียนเป็นไฟล์ (ไฟล์ wav) (Linux): MS_FILE_REC
  • เขียนเป็นไฟล์ (ไฟล์ wav) (Windows): MS_WINSND_WRITE
  • หน่วยเสียง Mac (Mac OS X)
  • MME (วินโดวส์)
  • OSS (ลินุกซ์): MS_OSS_WRITE, MS_OSS_READ
  • พอร์ตออดิโอ (Mac OS X)
  • PulseAudio (ลินุกซ์): MS_PULSE_WRITE, MS_PULSE_READ
  • เสียงของวินโดวส์ (Windows)

การเข้ารหัส/ถอดรหัสเสียง

  • G.711 กฎหมาย: 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

ตัวกรองวิดีโอ

การจับภาพและการเล่นวิดีโอ

  • จับภาพหุ่นยนต์
  • การเล่น Android
  • การจับภาพ AV Foundation (iOS)
  • การเล่น AV Foundation (iOS)
  • จับภาพ DirectShow (Windows)
  • เล่น DrawDib (Windows)
  • การเล่นภายนอก - การส่งวิดีโอไปที่เลเยอร์บนสุด
  • เล่น GLX (Linux): MS_GLXVIDEO
  • โคลน - ภาพเคลื่อนไหวสังเคราะห์: MS_MIRE
  • การเล่น OpenGL (Mac OS X)
  • การเล่น OpenGL ES2 (Android)
  • จับภาพ Quicktime (Mac OS X)
  • เล่น SDL: MS_SDL_OUT
  • เอาต์พุตภาพนิ่ง: MS_STATIC_IMAGE
  • วิดีโอสำหรับ Linux (V4L) จับภาพ (Linux): MS_V4L
  • วิดีโอสำหรับการจับภาพ Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • การจับภาพ Video4windows (DirectShow) (Windows)
  • การจับภาพ Video4windows (DirectShow) (Windows CE)
  • การจับภาพวิดีโอสำหรับ Windows (vfw) (Windows)
  • เล่น XV (Linux)

การเข้ารหัส/ถอดรหัสวิดีโอ

  • 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 ฮาร์ดแวร์ตัวเร่งความเร็วตัวเข้ารหัส/ตัวถอดรหัส

หลังจากคำอธิบายสั้นๆ ของตัวกรอง ชื่อของประเภทจะปรากฏขึ้น ซึ่งใช้เมื่อสร้างอินสแตนซ์ใหม่ของตัวกรองนี้ ต่อไปนี้เราจะกล่าวถึงรายการนี้

การติดตั้งภายใต้ Linux Ubuntu

ตอนนี้เราจะติดตั้ง Media streamer บนคอมพิวเตอร์และสร้างแอปพลิเคชันแรกของเราด้วย

การติดตั้ง Mediastremer2 บนคอมพิวเตอร์หรือเครื่องเสมือนที่ใช้ Ubuntu ไม่จำเป็นต้องมีทักษะพิเศษใดๆ ที่นี่และด้านล่าง สัญลักษณ์ "$" จะแสดงเชลล์พรอมต์สำหรับการป้อนคำสั่ง เหล่านั้น. หากในรายการคุณเห็นสัญลักษณ์นี้ที่จุดเริ่มต้นของบรรทัด แสดงว่านี่คือบรรทัดที่แสดงคำสั่งให้ดำเนินการในเทอร์มินัล

สันนิษฐานว่าในระหว่างขั้นตอนต่างๆ ในบทความนี้ คอมพิวเตอร์ของคุณสามารถเข้าถึงอินเทอร์เน็ตได้

การติดตั้งแพ็คเกจ libmediastremer-dev

เปิดเทอร์มินัลแล้วพิมพ์คำสั่ง:

$ sudo apt-get update

คุณจะถูกขอรหัสผ่านเพื่อทำการเปลี่ยนแปลง ป้อนรหัสผ่านแล้วผู้จัดการแพ็คเกจจะอัปเดตฐานข้อมูล หลังจากนั้นคุณต้องเรียกใช้:

$ sudo apt-get install libmediastreamer-dev

แพ็คเกจการพึ่งพาที่จำเป็นและไลบรารีสตรีมมีเดียจะถูกดาวน์โหลดและติดตั้งโดยอัตโนมัติ

ขนาดรวมของแพ็คเกจ deb ที่ขึ้นต่อกันที่ดาวน์โหลดจะอยู่ที่ประมาณ 35 MB สามารถดูรายละเอียดเกี่ยวกับแพ็คเกจที่ติดตั้งได้ด้วยคำสั่ง:

$ 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

ผลลัพธ์จะเป็นดังนี้:

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 แสดงขึ้น มันถูกใช้เพื่อควบคุมการ์ดเสียง ผู้พัฒนาสตรีมสื่อเองเชื่อว่านี่เป็นเรื่องปกติ ในกรณีนี้เราเห็นด้วยกับพวกเขาอย่างไม่เต็มใจ

ตอนนี้เราพร้อมที่จะทำงานกับสตรีมสื่อแล้ว เราได้ติดตั้งไลบรารีสตรีมมีเดีย เครื่องมือคอมไพล์ และใช้แอปพลิเคชันทดลอง ตรวจสอบว่ามีการกำหนดค่าเครื่องมือและเริ่มต้นสตรีมมีเดียสำเร็จ

ต่อไป статье เราจะสร้างแอปพลิเคชันที่จะรวบรวมและเรียกใช้การประมวลผลสัญญาณเสียงในห่วงโซ่ของตัวกรองหลายตัว

ที่มา: will.com