操作系統 :CentOS 7.6_x64
Python版本:3.9.12
dpkt版本:1.9.8
PCMA編碼是VoIP通信中常見的格式,今天整理下CentOS7環境下,python3如何使用dpkt生成PCMA格式rtp流的筆記,並提供相關示例代碼、運行效果視頻和配套文件下載。
我將從以下幾方面進行展開:
-
背景材料
-
使用dpkt生成PCMA格式rtp包
-
使用wav文件PCMA格式rtp流
-
運行效果截圖及視頻
-
配套資源下載
一、背景材料
1、安裝dpkt
pypi地址:https://pypi.org/project/dpkt/
文檔地址:https://dpkt.readthedocs.io/en/latest/
GitHub地址:https://github.com/kbandla/dpkt
安裝命令:
pip install dpkt
2、payload type定義
rfc文檔:
https://www.rfc-editor.org/rfc/rfc3551.html
PCMA編碼的PT值是8。
二、生成rtp數據包
rtp包定義參考rfc文檔:
https://www.rfc-editor.org/rfc/rfc3550
在dpkt包裏面定義的有RTP對象,可以使用dpkt生成rtp包,示例代碼如下(genPkt1.py):
import dpkt pkt=dpkt.rtp.RTP() pkt.m = 0 pkt.pt = 8 pkt.seq = 1234 pkt.ts = 5678 pkt.ssrc = 0xabcdef01 data = '''d5d5d5d5d5d5d555d555d555d555d5d5d5d5d555d5d5d5d5d5d5d5d5555555555555555555555555555555555555555555d55555d55555d555555555d555d5d55555555555555555555555555555d5d55555555555d55555d5d5d5555555d555555555d5555555d555555555d555d5d5555555d5d555d5d5d5d5d5d5d5d555d5d5d5d5d5d5d555d5d5d5d5d5d5d5d5d5d555d555d5d5d5d5d5d5d5d5d5d555d5''' pkt.data = bytes.fromhex(data) pkt.pprint() pkt.pack() # rtp raw data , can send by socket
運行效果如下:
三、使用wav文件生成rtp流
1、準備wav文件
這裏以Audacity爲例進行演示,該軟件的介紹可參考這裏:
1)生成音頻
這裏以Risset鼓點爲例生成音頻文件
2)導出wav文件
格式:
pcm_s16le ([1][0][0][0] / 0x0001), 8000 Hz, mono, s16, 128 kb/s
3)使用ffmpeg驗證格式
ffmpeg -i test111.wav
2、使用python3發送rtp流
導出的wav文件是s16le格式的音頻,目標pt是pcma,需要藉助audioop的lin2alaw函數來實現。
https://docs.python.org/3/library/audioop.html
3、運行效果
首先需要開啓抓包:
tcpdump -i enp0s3 udp -w t111.pcap
運行腳本:
../bin/python3.9 genRtp1.py
運行效果如下:
抓包效果如下:
四、資源下載
本文涉及源碼及相關文件,可以從如下途徑獲取:
關注微信公衆號(聊聊博文,文末可掃碼)後回覆 20240501 獲取。