環境:CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Python版本:3.9.12 一、背景描述 PCM(Pulse Code Modulation,脈衝編碼調製)音頻數據是未經壓縮的音頻採樣數據,它是由模擬信號經過採樣、量化、編碼轉換成的標準數字音頻數據。 在FreeSW ...
環境: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文件,可參考這篇文章:
這裡示例下提取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進行播放,具體參考我之前的文章:
需要註意的是wireshark抓包的數據是大端位元組序,導出的pcm文件是s16be格式。
這裡提供一種Windows 10 環境下使用pyaudio進行播放的方法。
pyaudio 版本 :0.2.13
文件:playL16.py
內容如下:
L16編碼raw數據提取及播放效果視頻:
關註微信公眾號(聊聊博文,文末可掃碼)後回覆 2023050701 獲取。
四、資源下載
本文涉及源碼及二進位文件,可以從如下途徑獲取:
關註微信公眾號(聊聊博文,文末可掃碼)後回覆 20230507 獲取。
微信公眾號: