python3使用dpkt生成PCMA格式rtp流

操作系統 :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

大致步驟如下:  
1)讀取wav數據;  
2)將wav數據轉換爲pcma數據;  
3)使用socket發送pcma數據到目的地址;  
4)使用tcpdump進行抓包;  
5)使用wireshark驗證抓包數據;  
示例代碼(genRtp1.py):

完整代碼可從如下渠道獲取:
關注微信公衆號(聊聊博文,文末可掃碼)後回覆 20240501 獲取。

3、運行效果

首先需要開啓抓包:

tcpdump -i enp0s3 udp -w t111.pcap

運行腳本:

../bin/python3.9 genRtp1.py

運行效果如下:

 抓包效果如下:

運行效果視頻可從如下渠道獲取:
關注微信公衆號(聊聊博文,文末可掃碼)後回覆 2024050101 獲取。

四、資源下載

本文涉及源碼及相關文件,可以從如下途徑獲取:

關注微信公衆號(聊聊博文,文末可掃碼)後回覆 20240501 獲取。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章