FreeSWITCH使用L16編碼通訊及raw資料提取

2023-05-08 06:00:37

環境: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 獲取。