环境: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版本是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

具体配置如下:

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 编码:

3)数据抓包及编码查看

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

三、raw数据提取及播放

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

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

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

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

libpcap版本:1.11.0b7

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

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

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

文件:export_raw_libpcap.py

内容如下:

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

scapy版本:2.5.0

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

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

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

文件:export_raw_scapy.py

内容如下:

3、运行效果

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

4、L16格式音频播放

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

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

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

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

pyaudio 版本 :0.2.13

文件:playL16.py

内容如下:

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

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

四、资源下载

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

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

FreeSWITCH使用L16编码通信及raw数据提取的更多相关文章

  1. 导入excel并进行数据提取

    /** * @description: 导入excel并进行数据提取 * @param {type} * @return: */ Vue.prototype.$importExcel = functi ...

  2. 【转载】使用Pandas进行数据提取

    使用Pandas进行数据提取 本文转载自:蓝鲸的网站分析笔记 原文链接:使用python进行数据提取 目录 set_index() ix 按行提取信息 按列提取信息 按行与列提取信息 提取特定日期的信 ...

  3. PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句

    以数据库 msg 为例,说明 PDO 的数据提取.预处理语句: mysql> show tables;+---------------+| Tables_in_msg |+----------- ...

  4. 什么是RAW数据?

    现在数码照片的存储格式,以及在网络上应用的最普遍的图片格式就是JPEG格式了(Joint Photographic Expert Group).但是作为一种有损的图像压缩格式(现在也有少数数码相机提供 ...

  5. 转:SQL SERVER数据库中实现快速的数据提取和数据分页

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  6. PHP实例 表单数据插入数据库及数据提取 用户注册验证

    网站在进行新用户注册时,都会将用户的注册信息存入数据库中,需要的时候再进行提取.今天写了一个简单的实例. 主要完成以下几点功能: (1)用户进行注册,实现密码重复确认,验证码校对功能. (2)注册成功 ...

  7. pl/sql programming 15 数据提取

    数据提取 -- 游标 游标只是一个指向某个结果集的指针. 声明游标: cursor employee_cur IS select * from employees; 打开游标: open employ ...

  8. SQL 正则表达式使模式匹配和数据提取变得更容易

    SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易 David Banister 本文讨论: 使用正则表达式进行高效的 SQL 查询 SQL Server 2005 对正则表达式 ...

  9. PHP+Mysql-表单数据插入数据库及数据提取完整过程

    网站在进行新用户注册时,都会将用户的注册信息存入数据库中,需要的时候再进行提取.今天写了一个简单的实例. 主要完成以下几点功能: (1)用户进行注册,实现密码重复确认,验证码校对功能. (2)注册成功 ...

  10. 海量日志数据提取某日访问百度次数最多的那个IP的Java实现

    海量日志数据提取某日访问百度次数最多的那个IP的Java实现 前几天在网上看到july的一篇文章<教你如何迅速秒杀掉:99%的海量数据处理面试题>,里面说到百度的一个面试题目,题目如下: ...

随机推荐

  1. 不同页面的 body设置

    由于SPA页面的特性,传统的设置 body 背景色的方法并不通用. 解决方案:利用组件内的路由实现 第一种方式 // 实例创建之前 beforeCreate(){ document.querySele ...

  2. mysql 以自增id等于某个random()函数算出的值为条件查出两条数据

    SELECT id FROM users WHERE id = FLOOR( rand() * ( (SELECT max(id) FROM users) - (SELECT min(id) FROM ...

  3. UI资源,可在几分钟内创建精美的设计

    UI资源,可在几分钟内创建精美的设计 组件:https://headlessui.com 图标:https://icons8.com 插画:https://undraw.co/illustration ...

  4. Java笔记第四弹

    File类创建功能 public boolean createNewFile();//当该文件名不存在时,创建一个由该抽象路径名命名的新空文件 public boolean mkdir();//创建由 ...

  5. 对Javaweb的相关练习之利用.jsp文件和.java文件将输入的数据存储到指定的数据库中

    练习分析 import javax.servlet.*; import javax.servlet.annotation.WebServlet; import javax.servlet.http.* ...

  6. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(11)-Charles如何模拟弱网环境

    1.前言 张三:"我写的软件好奇怪啊,在网络好的时候一点问题也没有,但是信号差的时候明显卡顿,看来我只能一直蹲在卫生间.电梯或者地铁(信号差)调bug了". Charles:&qu ...

  7. Javacv 音视频小工具 - 下载抖音视频

    一.前言 大家好,俗话说的好,学习新的知识后要学以致用,在学习音视频的过程中,你有没有疑问,不知道音视频可以用来做什么.下面举几个例子,比较耳熟能详,被吹到风口的一些场景有:AI 视觉计算, AI 人 ...

  8. while与do-while的区别是什么,怎么用?

    前言 在上一篇文章中,壹哥给大家讲解了循环的概念,并重点给大家讲解了for循环的使用.但在Java中,除了for循环之外,还有while.do-while.foreach等循环形式.今天壹哥就再用一篇 ...

  9. c++与linux详细计划,精确到每一天(仅80天)

    好的,以下是三个月中每一天的学习计划: 第一个月: 第1天:阅读C++教程,熟悉环境,了解基本语法和数据类型 第2天:编写Hello World程序,加深对C++环境的了解 第3天:学习函数的定义和调 ...

  10. String API(全)

    类型 名称 char charAt(int index)返回 char指定索引处的值. int codePointAt(int index)返回指定索引处的字符(Unicode代码点). int co ...