探索 Mediastreamer2 VoIP 引擎。 第 1 部分

文章素材取自我 禅频道.

介绍

本文是有关使用 Mediastreamer2 引擎进行实时媒体处理的系列文章的开始。 演示将涉及 Linux 终端工作和 C 语言编程的最低技能。

Mediastreamer2 是流行的开源软件 VoIP 电话项目背后的 VoIP 引擎。 Linphone会。 在Linphone Mediastreamer2中实现了与声音和视频相关的所有功能。 引擎功能的详细列表可以在此 Mediastreamer 页面上查看。 源代码在这里: GitLab.

在本文中,为了方便起见,我们将使用其俄语表示法:“媒体流媒体”,而不是“Mediastreamer2”一词。

它的创建历史并不完全清楚,但从它的源代码来看,它之前使用过该库 格里布,这可以说暗示了与 的GStreamer。 相比之下,流媒体看起来更加轻巧。 Linphone 的第一个版本出现于 2001 年,因此目前流媒体播放器已经存在并发展了近 20 年。

媒体流的核心是一个称为“Data flow”(数据流)的架构。 下图显示了此类架构的示例。

探索 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
  • 文件播放器(原始/wav 文件)(Windows):MS_WINSND_READ
  • 写入文件(wav 文件)(Linux):MS_FILE_REC
  • 写入文件(wav 文件)(Windows):MS_WINSND_WRITE
  • Mac 音频单元 (Mac OS X)
  • 多媒体管理系统(Windows)
  • OSS(Linux):MS_OSS_WRITE、MS_OSS_READ
  • PortAudio(Mac OS X)
  • PulseAudio (Linux):MS_PULSE_WRITE、MS_PULSE_READ
  • Windows 声音 (Windows)

音频编码/解码

  • G.711 a 律: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 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)
  • 十五、回放(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下安装

现在我们将在计算机上安装媒体流媒体并用它构建我们的第一个应用程序。

在运行 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

使用您最喜欢的文本编辑器并创建一个名为的 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 库显示的错误消息,它用于控制声卡。 流媒体的开发人员自己认为这是正常的。 在这种情况下,我们勉强同意他们的观点。

现在我们已经准备好使用媒体流媒体了。 我们已经安装了媒体流媒体库、编译工具,并使用试用应用程序验证了工具是否已配置以及媒体流媒体初始化是否成功。

下一个 文章 我们将创建一个应用程序,该应用程序将在多个滤波器链中组装并运行音频信号的处理。

来源: habr.com