FreeSWITCH使用L16编码通信及raw数据提取

环境:CentOS 7.6_x64

FreeSWITCH版本 :1.10.9

Python版本:3.9.12

一、背景描述

PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压缩的音频采样数据,它是由模拟信号经过采样、量化、编码转换成的标准数字音频数据。

在FreeSWITCH中体现为L16编码(switch_pcm.c文件),和网络平台进行音频对接时会使用到该编码,这里记录下如何使用FreeSWICH进行L16编码通信,以及如何从pcap文件中获取raw数据。

FreeSWITCH使用L16编码通信及raw数据提取

这里使用的FreeSWITCH版本是1.10.9,操作系统是CentOS 7.6_x64,FreeSWITCH的编译及安装可参考我之前写的文章:CentOS7环境源码安装freeswitch1.10

二、具体实现

1、配置FS及软电话支持L16编码

1)配置FS支持L16编码

文件:freeswitch/conf/vars.xml添加L16编码:

<X-PRE-PROCESS cmd="set" data="global_codec_prefs=OPUS,G722,PCMU,PCMA,H264,VP8,iLBC,L16"/>
<X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=OPUS,G722,PCMU,PCMA,H264,VP8,iLBC,L16"/>

2)配置软电话支持L16编码

这里使用 MicroSIP 软电话,启用编码:LPCM 8kHz

具体配置如下:

FreeSWITCH使用L16编码通信及raw数据提取

 2、L16编码通话及抓包

1)配置测试拨号方案

拨打 6001 播放moh音频,具体如下:

<extension name="moh_test">
    <condition field="destination_number" expression="^6001$">
          <action application="answer"/>
          <action application="playback" data="local_stream://moh"/>
    </condition>
</extension>

2)使用L16编码进行通话

注册分机,拨打 6001 进行通话,在控制台可以看到使用的是 L16 编码:

FreeSWITCH使用L16编码通信及raw数据提取

 3)数据抓包及编码查看

在服务器上抓包后使用wireshark进行查看:

FreeSWITCH使用L16编码通信及raw数据提取

三、raw数据提取及播放

wireshark不能播放L16格式的音频数据:

FreeSWITCH使用L16编码通信及raw数据提取

 需要从RTP数据中提取payload数据,然后使用其它工具进行播放。

FreeSWITCH使用L16编码通信及raw数据提取

这里介绍两种使用python提取raw数据的方法,具体如下。

1、使用libpcap从pcap文件提取pcm数据

libpcap版本:1.11.0b7

python3如何使用libpcap解析pcap文件,可参考这篇文章:

python3使用libpcap库进行抓包及数据处理

这里示例下提取pcm数据的流程。

文件:export_raw_libpcap.py

内容如下:

FreeSWITCH使用L16编码通信及raw数据提取

2、使用scapy从pcap文件提取pcm数据

scapy版本:2.5.0

scapy地址:https://scapy.net/

scapy文档地址:https://scapy.readthedocs.io/

这里示例下提取pcm数据的流程。

文件:export_raw_scapy.py

内容如下:

FreeSWITCH使用L16编码通信及raw数据提取

3、运行效果

运行python脚本,可从pcap文件中提取L16格式的pcm数据,效果如下:

FreeSWITCH使用L16编码通信及raw数据提取

 4、L16格式音频播放

可使用 Audacity 、ffmpeg进行播放,具体参考我之前的文章:

pcm音频的录制、播放及转换

需要注意的是wireshark抓包的数据是大端字节序,导出的pcm文件是s16be格式。

这里提供一种Windows 10 环境下使用pyaudio进行播放的方法。

pyaudio 版本 :0.2.13

文件:playL16.py

内容如下:

FreeSWITCH使用L16编码通信及raw数据提取

 L16编码raw数据提取及播放效果视频:

关注微信公众号(聊聊博文,文末可扫码)后回复 2023050701 获取。 

四、资源下载

本文涉及源码及二进制文件,可以从如下途径获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20230507 获取。 

FreeSWITCH使用L16编码通信及raw数据提取 

原文链接:https://www.cnblogs.com/MikeZhang/p/L16ExportAndPlay20230507.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:FreeSWITCH使用L16编码通信及raw数据提取 - Python技术站

(0)
上一篇 2023年5月8日
下一篇 2023年5月8日

相关文章

  • 基于Python制作天眼查小程序的示例代码

    下面是“基于Python制作天眼查小程序的示例代码”的完整攻略。 1. 需求分析 在开始编写代码之前,需要对需求进行分析。我们要制作一个“天眼查小程序”,用户可以通过输入公司名称,然后程序会返回相应的公司信息。这个小程序需要满足以下要求: 用户可以通过命令行输入公司名称; 程序会请求天眼查的API,并返回公司信息。 2. 进行API请求 我们首先需要进行AP…

    python 2023年5月23日
    00
  • python实现一个围棋小游戏

    下面是“Python实现一个围棋小游戏”的完整攻略: 1. 准备工作 在开始编写围棋小游戏前,我们需要先准备好所需的工具和环境: Python编程语言 Pygame游戏开发框架 其中,Pygame是用于编写游戏的一个开发框架,它包含了各种游戏开发所需的功能模块和库。在开始编写游戏前,我们需要先安装它。 Pygame的安装可以通过以下命令来完成: pip in…

    python 2023年5月19日
    00
  • 如何使用Python在MySQL中使用触发器?

    当使用Python与MySQL一起使用时,可以使用触发器来自动执行某些操作。触发器是MySQL中的一种特殊类型的存储过程,它在特定的事件发生时自动执行。以下是使用Python在MySQL中使用触发器的完整略,包括创建触发器、使用触发器和删除触发器等步骤。同时,还提供了两个示例来演示如何Python中使用MySQL触发器。 创建触发器 在Python中使用触发…

    python 2023年5月12日
    00
  • python 中的列表解析和生成表达式

    Python中的列表解析和生成表达式 在Python中,列表解析和生成表达式是两种非常常用的语法,它们可以快速地生成新的列表。本攻略将详细介绍Python中的列表解析和生成表达式的语法和用法,并提供一些示例说明。 列表解析 列表解析是一种快速生成新列表的语法,它可以使用一行代码生成一个新的列表。列表解析的语法如下: new_list = [expressio…

    python 2023年5月13日
    00
  • python字符串的拼接方法总结

    针对“python字符串的拼接方法总结”,有如下完整攻略: 1. 使用加号“+”进行字符串的拼接 将两个字符串拼接在一起使用加号“+”,如下所示: str1 = "hello" str2 = "world!" str3 = str1 + ‘ ‘ + str2 print(str3) # 输出:"hello w…

    python 2023年6月5日
    00
  • python数据可视化plt库实例详解

    Python数据可视化plt库实例详解 本文将详细讲解Python的数据可视化plt库,包括其基本用法、常见图形的绘制方法和进阶技巧等内容。 基本用法 Matplotlib是Python中最常用的绘图工具,它是一个2D绘图库,可用于绘制线图、散点图、柱状图、等高线图、3D图形等等。其中,plt库是Matplotlib的一个常用模块,用于快速绘制图形。 下面是…

    python 2023年5月19日
    00
  • wxPython定时器wx.Timer简单应用实例

    下面是详细的wxPython定时器wx.Timer简单应用实例攻略: 一、wxPython定时器wx.Timer简介 wxPython定时器wx.Timer是用于在指定时间间隔内执行操作的工具,常用于处理定时或周期性的任务。wx.Timer为我们提供了非常方便的方式去执行后台任务。 二、wxPython定时器wx.Timer的使用步骤 导入wxPython库…

    python 2023年6月2日
    00
  • 如何学习一门编程语言

    学习一门编程语言需要一个系统的学习计划和实践过程。以下是一个完整的攻略,帮助你学习一门编程语言,让你快速掌握并运用它: 1. 确定学习目标 在开始学习之前,你需要先确定你的学习目标和计划。考虑以下问题: 你想学习的编程语言是什么?为什么要学这门语言? 你的学习时间是多少?你计划每天花多少时间学习? 你想要用这门语言做什么?例如,编写网页、开发游戏或者搭建机器…

    python 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部