Для приложения контроля качества речи VoIP мне нужно сравнить входящий аудиопоток RTP с опорным сигналом. Для сравнения сигналов я использую уже существующие инструменты специального назначения. Для других частей (кроме захвата пакетов) библиотека Gstreamer казалась хорошим выбором. Я использую следующий трубопровод для имитации скелетного VoIP клиента:Gstreamer: RTP-буфер дрожания не работает должным образом с потерей пакетов?
filesrc location=foobar.pcap ! pcapparse ! "application/x-rtp, payload=0, clock-rate=8000"
! gstrtpjitterbuffer ! rtppcmudepay ! mulawdec ! audioconvert
! audioresample ! wavenc ! filesink location=foobar.wav
PCAP файл содержит один поток RTP медиа. Я создал файл захвата, в котором отсутствует 50 исходных 400 дейтаграмм UDP. Для данного звукового образца (8s долго для моего примера):
[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
с определенным количеством последовательных потерь пакетов я бы ожидать звуковой сигнал, как это будет выходом («-
» обозначает молчание):
[XXXXXXXXXXXXXXXXXXXXXXXX-----XXXXXXXXXXX]
однако, что на самом деле сохраняется в звуковом файле это (1s короче для моего примера):
[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
это кажется, что буфер джиттера, важной частью этого приложения является не работает правильно. Может ли это быть несовместимо с/недостатком элемента pcapparse
? Не хватает ли ключевой части в конвейере для обеспечения синхронизации времени? Что еще может быть причиной этого?
Я могу жить с раствором минималистичным, т.е. простой потерей или без потери маскировки. Однако здесь не все время воспроизведения. После дальнейшего исследования кажется, что это действительно проблема с 'pcapparse', точнее, синхронизацией времени между' pcapparse' и 'rtppcmudepay'. Если я использую 'udpsrc' в качестве исходного элемента, тогда все работает так, как ожидалось. – paprika