探索 Mediastreamer2 VoIP 引擎。 第 1 部分

文章素材取自我 禪頻道.

介紹

本文是有關使用 Mediastreamer2 引擎進行實時媒體處理的系列文章的開篇。 在演示過程中,將涉及使用 Linux 終端和使用 C 語言編程的最低限度技能。

Mediastreamer2 是流行的開源軟件 voip 電話項目背後的 VoIP 引擎。 門鈴. 在 Linphone 中,Mediastreamer2 實現了與聲音和視頻相關的所有功能。 可以在此 Mediastreamer 頁面上查看引擎功能的詳細列表。 源代碼在這裡: GitLab.

在本文的後面,為了方便起見,我們將使用俄語表示法代替 Mediastreamer2 這個詞:“media streamer”。

它的創建歷史並不完全清楚,但從它的源代碼來看,它以前使用了庫 格里布, 這似乎暗示了與 的GStreamer. 相比之下,媒體流媒體看起來更輕巧。 Linphone 的第一個版本出現於 2001 年,因此流媒體播放器的存在和發展已有將近 20 年的時間。

流媒體播放器的核心是一個稱為“數據流”(data flow)的架構。 下圖顯示了此類架構的示例。

探索 Mediastreamer2 VoIP 引擎。 第 1 部分

在這種架構中,數據處理算法不是由程序代碼指定的,而是由可以按任意順序排列的連接函數的方案(圖形)指定的。 這些功能稱為過濾器。

這種架構使得以一組連接到 VoIP 電話 RTP 流量處理和傳輸方案的過濾器的形式實現媒體處理功能成為可能。

將過濾器組合成任意方案的能力、新過濾器的簡單開發、媒體流作為一個獨立的獨立庫的實現,允許它在其他項目中使用。 此外,該項目可以在 VoIP 領域,因為可以添加自己製作的過濾器。

默認提供的過濾器庫非常豐富,並且如前所述,可以使用我們自己設計的過濾器進行擴展。 但首先,讓我們描述一下 media streamer 附帶的現成過濾器。 這是他們的名單:

聲音過濾器

音頻採集和播放

  • 阿爾薩 (Linux): 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)
  • 藝術(Linux):MS_ARTS_WRITE,MS_ARTS_READ
  • DirectSound(Windows):MS_WINSNDDS_WRITE,MS_WINSNDDS_READ
  • 文件播放器(raw/wav/pcap 文件)(Linux):MS_FILE_PLAYER
  • 文件播放器(原始/wav 文件)(Windows):MS_WINSND_READ
  • 寫入文件(wav 文件)(Linux):MS_FILE_REC
  • 寫入文件(wav 文件)(Windows):MS_WINSND_WRITE
  • Mac 音頻單元 (Mac OS X)
  • MME(視窗)
  • 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
  • 語音: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 捕獲 (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)
  • 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
  • Theora:MS_THEORA_ENC,MS_THEORA_DEC
  • VP8:MS_VP8_ENC,MS_VP8_DEC

視頻處理

  • 快照
  • 像素格式轉換器: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 並使用它構建我們的第一個應用程序。

在運行 Ubuntu 的計算機或虛擬機上安裝 Mediastremer2 不需要任何特殊技能。 在這里和下面,符號“$”將表示用於輸入命令的 shell 提示符。 那些。 如果在列表中您在行的開頭看到這個符號,那麼這就是顯示要在終端中執行的命令的行。

假設在本文的步驟中,您的計算機可以訪問 Internet。

安裝 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

使用您最喜歡的文本編輯器並創建一個名為 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 庫顯示的錯誤信息,它是用來控制聲卡的。 媒體流媒體的開發者自己認為這是正常的。 在這種情況下,我們勉強同意他們。

現在我們都準備好使用媒體流媒體了。 我們已經安裝了 media streamer 庫、編譯工具,並使用試用應用程序,驗證工具已配置且 media streamer 已成功初始化。

下一個 文章 我們將創建一個應用程序,該應用程序將在多個過濾器鏈中組裝和運行音頻信號的處理。

來源: www.habr.com