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

    <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 获取。 

     

  • 相关阅读:
    如何在Dev-c++中向项目初始源文件插入代码?
    【rar密码】rar文件不知道解压密码怎么解压?
    调用链监控工具之CAT上
    公交调度-车次链编制贪心算法
    【LeetCode】【剑指offer】【机器人的运动范围】
    .net 温故知新:【8】.NET 中的配置从xml转向json
    qiankun微前端实践
    STM32F407(野火霸天虎v2)学习理解记录(持续更新)
    C语言中自定义类型讲解
    在Docker中运行PostgreSQL数据库
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/L16ExportAndPlay20230507.html