Mediastreamer2 VoIP エンジンを探索します。 パート1

記事の素材は私のものから引用しました 禅チャンネル.

導入

この記事は、Mediastreamer2 エンジンを使用したリアルタイム メディア処理に関する一連の記事の始まりです。 プレゼンテーションには、Linux ターミナルでの作業と C 言語でのプログラミングに関する最低限のスキルが必要です。

Mediastreamer2 は、人気のあるオープンソース ソフトウェア voip 電話プロジェクトを支える VoIP エンジンです。 リンフォン。 Linphone Mediastreamer2 では、サウンドとビデオに関するすべての機能が実装されています。 エンジン機能の詳細なリストは、この Mediastreamer ページでご覧いただけます。 ソースコードはここにあります: GitLab.

本文では、便宜上、Mediastreamer2 という単語の代わりに、ロシア語表記の「メディア ストリーマー」を使用します。

作成の歴史は完全には明らかではありませんが、ソース コードから判断すると、以前は次のライブラリを使用していました。 グリブ、いわば、それとの遠い関係の可能性を示唆しています。 GStreamer。 それに比べて、メディアストリーマーはより軽量に見えます。 Linphone の最初のバージョンは 2001 年に登場したため、現時点でメディア ストリーマーは 20 年近く存在し、開発されています。

メディアストリーマーの中心となるのは「データフロー」(データフロー)と呼ばれるアーキテクチャです。 このようなアーキテクチャの例を次の図に示します。

Mediastreamer2 VoIP エンジンを探索します。 パート1

このアーキテクチャでは、データ処理アルゴリズムはプログラムコードではなく、任意の順序で配置できる関数の接続スキーム(グラフ)によって指定されます。 これらの関数はフィルターと呼ばれます。

このアーキテクチャにより、VoIP 電話の RTP トラフィック処理および送信スキームに接続された一連のフィルタの形式でメディア処理機能を実装することが可能になります。

フィルタを任意のスキームに結合する機能、新しいフィルタの簡単な開発、独立した別個のライブラリとしてのメディア ストリーマの実装により、他のプロジェクトで使用できるようになります。 また、自作のフィルタを追加することもできるため、VoIP分野のプロジェクトとしても活用できます。

デフォルトで提供されるフィルター ライブラリは非常に豊富で、すでに述べたように、独自の設計のフィルターを使用して拡張できます。 その前に、メディア ストリーマーに付属する既製のフィルターについて説明しましょう。 彼らのリストは次のとおりです。

サウンドフィルター

オーディオのキャプチャと再生

  • Alsa (Linux): 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)
  • アート (Linux): MS_ARTS_WRITE、MS_ARTS_READ
  • DirectSound (Windows): 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 (Windows)
  • OSS (Linux): MS_OSS_WRITE、MS_OSS_READ
  • ポートオーディオ (Mac OS X)
  • PulseAudio (Linux): MS_PULSE_WRITE、MS_PULSE_READ
  • Windows サウンド (Windows)

オーディオのエンコード/デコード

  • G.711 a-law: MS_ALAW_DEC、MS_ALAW_ENC
  • G.711 μ-law: 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
  • Speex: 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 Foundation キャプチャ (iOS)
  • AV Foundation の再生 (iOS)
  • DirectShow キャプチャ (Windows)
  • DrawDib の再生 (Windows)
  • 外部再生 - ビデオを最上位レイヤーに送信
  • GLX 再生 (Linux): MS_GLXVIDEO
  • Mire - 合成動画:MS_MIRE
  • OpenGL の再生 (Mac OS X)
  • OpenGL ES2 の再生 (Android)
  • クイックタイム キャプチャ (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)
  • Video For 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
  • 複数の入力から XNUMX つの出力へのデータ ブロックの収集: 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 でのインストール

次に、メディア ストリーマをコンピュータにインストールし、それを使用して最初のアプリケーションを構築します。

Ubuntu を実行しているコンピューターまたは仮想マシンに Mediastremer2 をインストールするには、特別なスキルは必要ありません。 ここと以下で、記号「$」はコマンドを入力するためのシェル プロンプトを示します。 それらの。 リストの行の先頭にこの記号が表示されている場合、これはターミナルで実行されるコマンドが示されている行です。

この記事の手順では、コンピュータがインターネットにアクセスできることを前提としています。

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。 プログラムを開始します。

$ ./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 ライブラリが表示するエラー メッセージが表示されます。 メディア ストリーマーの開発者自身も、これが正常であると信じています。 この場合、私たちはしぶしぶ彼らに同意します。

これで、メディア ストリーマーを使用する準備がすべて整いました。 メディア ストリーマー ライブラリ、コンパイル ツールをインストールし、試用版アプリケーションを使用して、ツールが構成され、メディア ストリーマーが正常に初期化されることを確認しました。

статье いくつかのフィルターのチェーンでオーディオ信号の処理を組み立てて実行するアプリケーションを作成します。

出所: habr.com