环境: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. git的回退以及合并,删除什么的

    有时候不小心合并了别的分支中的commit.我们需要回退某些提交记录.可以通过reset来操作,reset 会回退到指定commit.这种方式会删除记录,我们最好使用revert命令来操作 git r ...

  2. [代码片段] 获取分辨率DPI和像素、毫米、英寸互相转换

    private static float DEFAULT_DPI_X = 0; private static float DEFAULT_DPI_Y = 0; /// <summary>获 ...

  3. redhat安装mysql8.0

    redhat 安装mysql 8.0 * 看mysql官方文档 * 安装epel源 * 安装mysql源 参考文章 redhat7通过yum安装mysql5.7.17教程:https://www.jb ...

  4. button 样式 触发器

    <Style x:Key="Style.OkOperationButton" TargetType="ButtonBase"> <Setter ...

  5. Qt Windows上实现毛玻璃效果

    首发于我的个人博客:xie-kang.com 博客内有更多文章,欢迎大家访问 原文地址 前言: 很多人看到这个需求的第一想法都是录制软件窗口后的桌面内容,并且加上个高斯模糊就能实现了. 思路没有错,操 ...

  6. Vue2使用axios,request.js和vue.config.js

    1.配置request.js,用来请求数据 import axios from 'axios' // 1:利用axios对象的方法create,创建一个axios实例 // 2:request就是ax ...

  7. windows系统下使用java语言,在mysql数据库中做定时数据备份、删除

    有这样一个业务需求,需要将数据归档的表每月定时备份,并且删除之前表中的数据,话不多说,直接上代码! 注意:这种方法适合数据量小,业务要求不高的场景! 项目采用SpringBoot  + MyBatis ...

  8. ajax缓存和fiddler——http协议调试代理工具

    1.在ie9下,ajax请求可能会有缓存,需要在请求上一个随机数 如:Math.random(); 2.fiddler2 打开以后可以查看所有的http请求情况,也可以使用本地脚本代替要请求的js文件 ...

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

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

  10. python安装第三方库出现“'pip' is not recognized ...”报错及其解决

    命令行安装第三方库,直接 通过命令 pip install XXX 会报错: 'pip' is not recognized as an internal or external command, o ...