Расшифровка помех пакетов RTP PCMU
Я пытался воспроизвести некоторые пакеты RTP, которые я захватил с помощью Python. Пакеты кодируются в формате PCMU согласно протоколу SIP/SDP. SDP INVITE выглядел примерно так:
v=0
o=root 1094672963 1094672963 IN IP4 192.168.0.102
s=Asterisk PBX 16.2.1~dfsg-1+deb10u1
c=IN IP4 192.168.0.102
t=0 0
m=audio 17362 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:20
a=maxptime:150
a=sendrecv
Я работал над этим несколько дней и не смог найти ответа на свои симптомы, поэтому я потерял пакет в Wireshark, но вот необработанные данные:
\xa8\x5e\x45\x5a\xf5\x6e\xb8\x27\xeb\xbb\xd8\x2f\x08\x00\x45\x00\x00\xc8\xa2\x78\x40\x00\x40\x11\x15\x8d\xc0\xa8\x00\x66\xc0\xa8\x00\x69\x4d\xb2\x1f\x40\x00\xb4\x28\x76\x80\x00\x1e\x24\x00\x01\xc8\x40\x57\x00\x68\x4d\x7e\xff\xff\xfe\xff\xff\xfe\xff\xff\xfe\xff\xff\x7e\xff\xff\xfe\x7e\x7e\xfe\xff\xff\xfe\xff\xff\x7e\xff\xff\x7e\xff\xff\x7e\xff\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\x7e\xff\xff\xff\xfe\xff\xff\xfe\xff\xff\xfe\xff\xff\xfe\xff\xff\xfe\xff\xff\x7e\xff\xff\x7d\x7e\x7e\xff\x7e\x7e\x7e\xff\xff\x7d\x7e\x7e\xff\x7e\x7e\xfe\xff\x7e\x7e\xff\xff\xff\x7e\xff\x7e\xff\xff\xfe\x7e\x7e\xfe\xff\x7e\xff\xff\xff\x7d\x7e\xff\x7d\x7e\x7e\x7e\x7e\x7e\xff\x7e\x7e\xfe\xff\x7e\xff\xff\xff\xfe\xff\xff\x7e\xff\xfe\x7e\x7e\xfe\xff\xff\x7e\xff\xff\x7d\x7e\xff\xfe\x7e\x7e\xfe\xff\x7e\xfe\xff\xff\xfc\xff\xff\xfe\xfe\xff\xff\xff\xfe\xfe\xff\xff\x7e\xff\xfe\xff\xff\xff\xa8\x5e\x45\x5a\xf5\x6e\xb8\x27\xeb\xbb\xd8\x2f\x08\x00\x45\x00\x00\xc8\xa2\x7a\x40\x00\x40\x11\x15\x8b\xc0\xa8\x00\x66\xc0\xa8\x00\x69\x4d\xb2\x1f\x40\x00\xb4\x7f\x34\x80\x00\x1e\x25\x00\x01\xc8\xe0\x57\x00\x68\x4d\xfe\x7e\xff\xff\xfe\xff\xff\x7e\xff\xff\x7d\xff\xff\xff\xff\x7e\x7e\x7e\x7e\x7d\x7e\x7e\x7d\x7e\x7e\xff\xff\x7e\xfe\xfe\xff\xfe\xfe\xff\x7c\x7e\xff\xff\xff\x7e\xff\x7e\x7e\x7d\x7e\x7e\x7d\x7d\x7e\xfe\x7e\x7e\xff\xff\xff\xff\xff\xff\xfd\xfe\xff\x7e\xff\xff\x7c\x7e\xff\xff\xff\x7e\x7e\x7e\x7e\xfc\xfe\xff\x7e\xff\xfe\x7e\xff\xff\xff\xfd\xfe\xff\x7e\x7e\xff\xfe\xff\xff\x7d\x7e\xff\xfe\xff\xff\x7e\x7e\xff\x7c\x7d\x7e\xfe\x7e\x7d\x7d\x7e\x7e\xff\x7e\x7d\xfe\xff\xfe\xf0\xf9\xfc\xfd\xfe\xfb\x7e\x7b\xfe\x7d\x7a\x7c\x7d\x77\x79\x7b\x7a\x7a\x7a\x7b\x7b\x7a\x7a\x7b\x7b\x7b\x7b\x7c\xff\x7e\x7d\xfc\xfe\xff\xfb\xfd\xfd\xf8\xfa\xfb\xfa\xf9\xfa\xfc
Вот код, который я использую, чтобы превратить его в звук:
import audioop
import simpleaudio as sa
import time
import wave
chunk=1024
#p = pyaudio.PyAudio()
audio = b"<raw data above>"
time.sleep(1)
f=wave.open('test.wav', 'wb')
f.setnchannels(1)
f.setsampwidth(1)
f.setframerate(8000)
i=0
while True:
parse = audio[i:i+chunk]
if parse == b'':
break
parse = audioop.ulaw2lin(parse,1)
parse = audioop.bias(parse, 1, 128)
f.writeframesraw(parse[56:])
i+=chunk
f.close()
Для некоторых кадров RTP вывод полезной нагрузки может проходить через этот код. Но для конкретного кадра, который здесь указан, создается этот вывод, визуализированный Audacity:
В этом конкретном пакете тишина, то есть в его середине просто случайное рассеяние звуковой волны, что заставляет меня думать, что в середине этой полезной нагрузки есть какие-то данные.
Я просмотрел RFC после RFC и 1. Не могу найти какой-либо конкретный формат полезной нагрузки для G.711 PCMU, который говорит больше, чем "Октеты должны быть выровнены". Я думал, что нашел что-то в формате полезной нагрузки RFC 5686 RTP для встроенного кодека mU-Law для речевого кодека UEMCLIP, но не смог найти никакой информации для синтаксического анализа, копая глубже, я нашел то, что, как я теперь понимаю, является ранним черновиком этого RFC, в котором говорилось эти пакеты должны начинаться с байта со значением 0x95, но я не смог найти ничего соответствующего этому на каждом этапе процесса декодирования (u-law to lin).
Мы будем очень благодарны за любые идеи или помощь в выяснении того, что это за помехи.