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基础之入门必看操作 Python是一种高级编程语言,易于学习和使用。本文将介绍Python的基础操作,包括变量、数据类型、运算符、条件语句、循环语句、函数模块等内容。本文旨在帮助初学者快速入门Python编程。 变量 在Python中,变量是用于存储的容器。变量可以存储不同类型的数据,例如整数、浮点数、字符串等。以下是一个示例,演示如何定义量: …

    python 2023年5月13日
    00
  • 浅谈Python大神都是这样处理XML文件的

    浅谈Python大神都是这样处理XML文件的 什么是XML文件 XML是一种标记语言,它的设计宗旨是传输数据,而非显示数据。XML提供了一种通用的语言来描述应用程序处理的数据,不受平台和开发语言的约束。XML文档往往用于对数据进行存储、交换和表示。 Python如何处理XML文件 Python语言提供了强大的标准库,内置了xml解析模块,通过调用这个模块可以…

    python 2023年6月3日
    00
  • python实现系统状态监测和故障转移实例方法

    实现系统状态监测和故障转移通常会用到Python的一些库,比如psutil和socket。完整的实现过程如下: 1. 导入必要的库 在Python中,将会用到psutil和socket两个库。可以通过pip命令来安装: pip install psutil pip install socket 然后在Python代码中导入这两个库: import psuti…

    python 2023年5月30日
    00
  • python绘制雷达图实例讲解

    我们来详细讲解一下“python绘制雷达图实例讲解”的完整攻略。 简介 首先,雷达图是一种多元统计图形。它通常由一个同心多边形组成,每个多边形代表不同的变量,并围成一块区域。在雷达图中,每个变量都沿着网格线放置,最后这些变量的值被连成一条折线,从而形成了一个封闭的多边形区域。通过比较多边形的面积来观察不同变量的差异,进而分析数据。 Python是一个十分强大…

    python 2023年5月18日
    00
  • Python读取csv文件分隔符设置方法

    当我们使用Python读取csv文件时,如果该文件的列与列之间的分隔符不是默认的逗号分隔符,那么就需要设置正确的分隔符来读取文件。 下面将为大家详细讲解Python读取csv文件分隔符设置方法的完整攻略,包含以下两个部分: 1.使用csv模块读取csv文件 2.使用pandas库读取csv文件 1.使用csv模块读取csv文件 在Python中,可以使用内置…

    python 2023年6月3日
    00
  • Python httplib模块使用实例

    下面就来详细讲解Python httplib模块使用实例的攻略。 什么是httplib模块? httplib是Python自带的HTTP客户端库,提供了HTTP协议相关的请求和响应处理功能。 httplib模块的使用方法 发送GET请求 使用httplib发送GET请求可以通过以下步骤进行: 引入httplib模块 python import httplib…

    python 2023年6月3日
    00
  • 在Django+Vue3+GraphQL的Blog例子代码中引入Element-Plus UI Framework

    Vue3的UI Framework中有Element-Plus、BalmUI、Quasar、PrimeVue、Ant Design Vue等UI Framework. Element-Plus是Element-UI的Vue3版,Element-UI的使用人数的基数较大,Github上的Star数也较多,就选择了Element-Plus作为这个Blog项目的U…

    python 2023年4月17日
    00
  • 如何使用Python实现数据库中数据的复杂查询?

    以下是使用Python实现数据库中数据的复杂查询的完整攻略。 数据库中数据的复杂查询简介 在数据库中,复杂查询是指从一个或多个表中检索数据的查询,同时还可以使用多个和运算符进行筛选和排序。在Python中,可以使用pymysql库连接到MySQL数据库,并使用SELECT语句实现复杂查询。 步骤1:连接到数据库 在Python中,可以使用pymysql库连接…

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