環境: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編碼
檔案: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
具體設定如下:
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進行檢視:
wireshark不能播放L16格式的音訊資料:
需要從RTP資料中提取payload資料,然後使用其它工具進行播放。
這裡介紹兩種使用python提取raw資料的方法,具體如下。
libpcap版本:1.11.0b7
python3如何使用libpcap解析pcap檔案,可參考這篇文章:
這裡範例下提取pcm資料的流程。
檔案:export_raw_libpcap.py
內容如下:
scapy版本:2.5.0
scapy地址:https://scapy.net/
scapy檔案地址:https://scapy.readthedocs.io/
這裡範例下提取pcm資料的流程。
檔案:export_raw_scapy.py
內容如下:
執行python指令碼,可從pcap檔案中提取L16格式的pcm資料,效果如下:
可使用 Audacity 、ffmpeg進行播放,具體參考我之前的文章:
需要注意的是wireshark抓包的資料是大端位元組序,匯出的pcm檔案是s16be格式。
這裡提供一種Windows 10 環境下使用pyaudio進行播放的方法。
pyaudio 版本 :0.2.13
檔案:playL16.py
內容如下:
L16編碼raw資料提取及播放效果視訊:
關注微信公眾號(聊聊博文,文末可掃碼)後回覆 2023050701 獲取。
本文涉及原始碼及二進位制檔案,可以從如下途徑獲取:
關注微信公眾號(聊聊博文,文末可掃碼)後回覆 20230507 獲取。