Khám phá công cụ VoIP Mediastreamer2. Phần 1

Tài liệu của bài viết được lấy từ tài liệu của tôi kênh thiền.

Giới thiệu

Bài viết này là phần mở đầu của một loạt bài viết về xử lý phương tiện thời gian thực bằng công cụ Mediastreamer2. Bài thuyết trình sẽ liên quan đến các kỹ năng tối thiểu để làm việc trong thiết bị đầu cuối Linux và lập trình bằng ngôn ngữ C.

Mediastreamer2 là công cụ VoIP đằng sau dự án điện thoại voip phần mềm mã nguồn mở phổ biến. điện thoại. Trong Linphone Mediastreamer2 thực hiện tất cả các chức năng liên quan đến âm thanh và video. Bạn có thể xem danh sách chi tiết các tính năng của công cụ trên trang Mediastreamer này. Mã nguồn ở đây: GitLab.

Hơn nữa trong văn bản, để thuận tiện, thay vì từ Mediastreamer2, chúng tôi sẽ sử dụng ký hiệu tiếng Nga của nó: "media streamer".

Lịch sử tạo ra nó không hoàn toàn rõ ràng, nhưng đánh giá bằng mã nguồn của nó, trước đây nó đã sử dụng thư viện Trơn, như nó vốn có, gợi ý về một mối quan hệ xa cách có thể xảy ra với GStreamer. So với bộ truyền phát đa phương tiện trông nhẹ hơn. Phiên bản đầu tiên của Linphone xuất hiện vào năm 2001, tính đến thời điểm hiện tại media streamer đã tồn tại và phát triển được gần 20 năm.

Trung tâm của media streamer là một kiến ​​trúc gọi là "Luồng dữ liệu" (data flow). Một ví dụ về kiến ​​trúc như vậy được thể hiện trong hình bên dưới.

Khám phá công cụ VoIP Mediastreamer2. Phần 1

Trong kiến ​​​​trúc này, thuật toán xử lý dữ liệu không được chỉ định bằng mã chương trình mà bằng sơ đồ (biểu đồ) để kết nối các chức năng có thể được sắp xếp theo bất kỳ thứ tự nào. Các chức năng này được gọi là bộ lọc.

Kiến trúc này cho phép triển khai chức năng xử lý phương tiện dưới dạng một tập hợp các bộ lọc được kết nối với sơ đồ truyền và xử lý lưu lượng RTP của điện thoại VoIP.

Khả năng kết hợp các bộ lọc thành các lược đồ tùy ý, phát triển đơn giản các bộ lọc mới, triển khai bộ truyền phát phương tiện như một thư viện riêng biệt độc lập, cho phép nó được sử dụng trong các dự án khác. Hơn nữa, dự án có thể thuộc lĩnh vực VoIP, vì có thể thêm các bộ lọc do chính bạn tạo.

Thư viện bộ lọc được cung cấp theo mặc định khá phong phú và như đã đề cập, có thể được mở rộng bằng các bộ lọc do chúng tôi thiết kế. Nhưng trước tiên, hãy mô tả các bộ lọc làm sẵn đi kèm với bộ truyền phát phương tiện. Đây là danh sách của họ:

bộ lọc âm thanh

Ghi và phát lại âm thanh

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Âm thanh gốc của Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Dịch vụ hàng đợi âm thanh (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Dịch vụ đơn vị âm thanh (Mac OS X)
  • Nghệ thuật (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • Âm thanh trực tiếp (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Trình phát tệp (tệp raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Trình phát tệp (tệp raw/wav) (Windows): MS_WINSND_READ
  • Ghi vào tệp (tệp wav) (Linux): MS_FILE_REC
  • Ghi vào tệp (tệp wav) (Windows): MS_WINSND_WRITE
  • Thiết bị âm thanh Mac (Mac OS X)
  • MME (Windows)
  • Một cửa (Linux): MS_OSS_WRITE, MS_OSS_READ
  • Cổng âm thanh (Mac OS X)
  • PulseAudio (Linux): MS_PULSE_WRITE, MS_PULSE_READ
  • Âm thanh Windows (Windows)

Mã hóa/giải mã âm thanh

  • Luật G.711: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-luật: 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 tuyến tính: MS_L16_ENC, MS_L16_DEC
  • Tốc độ: MS_SPEEX_ENC, MS_SPEEX_DEC

xử lý âm thanh

  • Chuyển đổi kênh (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Hội nghị: MS_CONF
  • Trình tạo DTMF: MS_DTMF_GEN
  • Hủy bỏ tiếng vọng (speex): MS_SPEEX_EC
  • Bộ chỉnh âm: MS_EQUALIZER
  • Máy trộn: MS_MIXER
  • Bộ bù mất gói (PLC): MS_GENERIC_PLC
  • Bộ lấy mẫu lại: MS_RESAMPLE
  • Bộ dò âm: MS_TONE_DETECTOR
  • Điều khiển âm lượng và đo mức tín hiệu: MS_VOLUME

bộ lọc video

Quay video và phát lại

  • chụp android
  • phát lại android
  • Chụp AV Foundation (iOS)
  • Phát lại AV Foundation (iOS)
  • Chụp DirectShow (Windows)
  • Phát lại DrawDib (Windows)
  • Phát lại bên ngoài - Gửi video lên lớp trên cùng
  • Phát lại GLX (Linux): MS_GLXVIDEO
  • Mire - Tổng hợp ảnh động: MS_MIRE
  • Phát lại OpenGL (Mac OS X)
  • Phát lại OpenGL ES2 (Android)
  • Ghi thời gian nhanh (Mac OS X)
  • Phát lại SDL: MS_SDL_OUT
  • Đầu ra hình ảnh tĩnh: MS_STATIC_IMAGE
  • Quay video cho Linux (V4L) (Linux): MS_V4L
  • Quay video cho Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Chụp Video4windows (DirectShow) (Windows)
  • Chụp Video4windows (DirectShow) (Windows CE)
  • Quay video cho Windows (vfw) (Windows)
  • Phát lại XV (Linux)

Mã hóa/giải mã video

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Tuyết: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (chỉ bộ giải mã): MS_H264_DEC
  • Lý thuyết: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

xử lý video

  • Ảnh chụp nhanh jpeg
  • Trình chuyển đổi định dạng pixel: MS_PIX_CONV
  • thay đổi kích thước
  • bộ lọc khác
  • Trao đổi khối dữ liệu giữa các luồng: MS_ITC_SOURCE, MS_ITC_SINK
  • Thu thập các khối dữ liệu từ nhiều đầu vào thành một đầu ra: MS_JOIN
  • Nhận/truyền RTP: MS_RTP_SEND, MS_RTP_RECV
  • Sao chép dữ liệu đầu vào sang nhiều đầu ra: MS_TEE
  • Tải đã kết thúc: MS_VOID_SINK
  • Nguồn im lặng: MS_VOID_SOURCE

Plugin

bộ lọc âm thanh

  • Bộ mã hóa/giải mã AMR-NB
  • Bộ mã hóa/giải mã G.729
  • Bộ mã hóa/giải mã iLBC
  • Bộ mã hóa/giải mã LỤA

    bộ lọc video

  • Bộ mã hóa phần mềm H.264
  • Bộ mã hóa/giải mã tăng tốc phần cứng H.264 V4L2

Sau một mô tả ngắn về bộ lọc, tên của loại được hiển thị, được sử dụng khi tạo phiên bản mới của bộ lọc này. Trong phần tiếp theo, chúng tôi sẽ đề cập đến danh sách này.

Cài đặt trên Linux Ubuntu

Bây giờ chúng tôi sẽ cài đặt bộ truyền phát phương tiện trên máy tính và xây dựng ứng dụng đầu tiên của chúng tôi với nó.

Cài đặt Mediastremer2 trên máy tính hoặc máy ảo chạy Ubuntu không yêu cầu bất kỳ kỹ năng đặc biệt nào. Ở đây và bên dưới, ký hiệu "$" sẽ biểu thị dấu nhắc trình bao để nhập lệnh. Những thứ kia. nếu trong danh sách, bạn thấy biểu tượng này ở đầu dòng, thì đây là dòng trong đó các lệnh được hiển thị sẽ được thực thi trong thiết bị đầu cuối.

Giả định rằng trong các bước trong bài viết này, máy tính của bạn có quyền truy cập Internet.

Cài đặt gói libmediastremer-dev

Khởi chạy terminal và gõ lệnh:

$ sudo apt-get update

Bạn sẽ được yêu cầu nhập mật khẩu để thực hiện thay đổi, hãy nhập mật khẩu đó và trình quản lý gói sẽ cập nhật cơ sở dữ liệu của nó. Sau đó, bạn cần chạy:

$ sudo apt-get install libmediastreamer-dev

Các gói phụ thuộc cần thiết và chính thư viện bộ truyền phát phương tiện sẽ được tự động tải xuống và cài đặt.

Tổng kích thước của các gói gỡ lỗi phụ thuộc đã tải xuống sẽ vào khoảng 35 MB. Chi tiết về gói đã cài đặt có thể được tìm thấy bằng lệnh:

$ dpkg -s libmediastreamer-dev

Ví dụ trả lờ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/

Cài đặt công cụ phát triển

Cài đặt trình biên dịch C và các công cụ đi kèm:

$ sudo apt-get install gcc

Chúng tôi kiểm tra kết quả bằng cách truy vấn phiên bản trình biên dịch:

$ gcc --version

Câu trả lời phải là một cái gì đó như thế này:

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.

Xây dựng và chạy ứng dụng thử nghiệm

chúng tôi tạo ra trong nhà thư mục cho các dự án hướng dẫn của chúng tôi, hãy gọi nó là hướng dẫn:

$ mkdir ~/mstutorial

Sử dụng trình soạn thảo văn bản yêu thích của bạn và tạo tệp chương trình C có tên mstest.c với nội dung như sau:

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

Nó khởi tạo bộ truyền phát phương tiện, in lời chào và thoát.

Lưu tệp và biên dịch ứng dụng thử nghiệm bằng lệnh:

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

Lưu ý rằng dòng

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

được đặt trong dấu ngoặc kép nằm trên bàn phím ở cùng vị trí với chữ "Ё".

Nếu tệp không có lỗi thì sau khi biên dịch sẽ xuất hiện tệp trong thư mục buồn nhất. Chúng tôi bắt đầu chương trình:

$ ./mstest

Kết quả sẽ như thế này:

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.

Trong danh sách này, chúng ta thấy các thông báo lỗi mà thư viện ALSA hiển thị, nó được sử dụng để điều khiển card âm thanh. Bản thân các nhà phát triển của trình truyền phát phương tiện tin rằng điều này là bình thường. Trong trường hợp này, chúng tôi hoàn toàn đồng ý với họ.

Bây giờ tất cả chúng ta đã sẵn sàng để làm việc với bộ truyền phát phương tiện. Chúng tôi đã cài đặt thư viện bộ truyền phát phương tiện, công cụ biên dịch và sử dụng ứng dụng dùng thử, xác minh rằng các công cụ đã được định cấu hình và bộ truyền phát phương tiện khởi tạo thành công.

Kế tiếp Bài viết chúng tôi sẽ tạo một ứng dụng sẽ lắp ráp và chạy quá trình xử lý tín hiệu âm thanh trong một chuỗi nhiều bộ lọc.

Nguồn: www.habr.com