環(huán)境:CentOS 7.6_x64
FreeSWITCH版本 :1.10.9
Python版本:3.9.12
一、背景描述
PCM(Pulse Code Modulation,脈沖編碼調(diào)制)音頻數(shù)據(jù)是未經(jīng)壓縮的音頻采樣數(shù)據(jù),它是由模擬信號經(jīng)過采樣、量化、編碼轉(zhuǎn)換成的標準數(shù)字音頻數(shù)據(jù)。
在FreeSWITCH中體現(xiàn)為L16編碼(switch_pcm.c文件),和網(wǎng)絡(luò)平臺進行音頻對接時會使用到該編碼,這里記錄下如何使用FreeSWICH進行L16編碼通信,以及如何從pcap文件中獲取raw數(shù)據(jù)。
這里使用的FreeSWITCH版本是1.10.9,操作系統(tǒng)是CentOS 7.6_x64,F(xiàn)reeSWITCH的編譯及安裝可參考我之前寫的文章:CentOS7環(huán)境源碼安裝freeswitch1.10
二、具體實現(xiàn)
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)數(shù)據(jù)抓包及編碼查看
在服務(wù)器上抓包后使用wireshark進行查看:
三、raw數(shù)據(jù)提取及播放
wireshark不能播放L16格式的音頻數(shù)據(jù):
?需要從RTP數(shù)據(jù)中提取payload數(shù)據(jù),然后使用其它工具進行播放。
這里介紹兩種使用python提取raw數(shù)據(jù)的方法,具體如下。
1、使用libpcap從pcap文件提取pcm數(shù)據(jù)
libpcap版本:1.11.0b7
python3如何使用libpcap解析pcap文件,可參考這篇文章:
python3使用libpcap庫進行抓包及數(shù)據(jù)處理
這里示例下提取pcm數(shù)據(jù)的流程。
文件:export_raw_libpcap.py
內(nèi)容如下:
2、使用scapy從pcap文件提取pcm數(shù)據(jù)
scapy版本:2.5.0
scapy地址:https://scapy.net/
scapy文檔地址:https://scapy.readthedocs.io/
這里示例下提取pcm數(shù)據(jù)的流程。
文件:export_raw_scapy.py
內(nèi)容如下:
3、運行效果
運行python腳本,可從pcap文件中提取L16格式的pcm數(shù)據(jù),效果如下:
?4、L16格式音頻播放
可使用 Audacity 、ffmpeg進行播放,具體參考我之前的文章:
pcm音頻的錄制、播放及轉(zhuǎn)換
需要注意的是wireshark抓包的數(shù)據(jù)是大端字節(jié)序,導出的pcm文件是s16be格式。
這里提供一種Windows 10 環(huán)境下使用pyaudio進行播放的方法。
pyaudio 版本 :0.2.13
文件:playL16.py
內(nèi)容如下:
?L16編碼raw數(shù)據(jù)提取及播放效果視頻:
關(guān)注微信公眾號(聊聊博文,文末可掃碼)后回復 2023050701 獲取。?
四、資源下載
本文涉及源碼及二進制文件,可以從如下途徑獲?。?/p>
關(guān)注微信公眾號(聊聊博文,文末可掃碼)后回復 20230507 獲取。?文章來源:http://www.zghlxwxcb.cn/news/detail-435951.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-435951.html
到了這里,關(guān)于FreeSWITCH使用L16編碼通信及raw數(shù)據(jù)提取的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!