天雷 发表于 2023-5-8 01:34:16

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版本是1.10.9,操作系统是CentOS 7.6_x64,FreeSWITCH的编译及安装可参考我之前写的文章:CentOS7环境源码安装freeswitch1.10
二、具体实现

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

1)配置FS支持L16编码
文件:freeswitch/conf/vars.xml添加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 获取。 
 

来源:https://www.cnblogs.com/MikeZhang/p/L16ExportAndPlay20230507.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: FreeSWITCH使用L16编码通信及raw数据提取