Für eine VoIP-Sprachqualitätsüberwachungsanwendung muss ich einen eingehenden RTP-Audiostream mit einem Referenzsignal vergleichen. Für den Signalvergleich selbst verwende ich bereits existierende Spezialwerkzeuge. Für die anderen Teile (außer Paketerfassung) schien die Gstreamer-Bibliothek eine gute Wahl zu sein. Ich verwende die folgende Pipeline ein Barebone-VoIP-Client zu simulieren:Gstreamer: RTP-Jitter-Puffer funktioniert nicht richtig mit Paketverlust?
filesrc location=foobar.pcap ! pcapparse ! "application/x-rtp, payload=0, clock-rate=8000"
! gstrtpjitterbuffer ! rtppcmudepay ! mulawdec ! audioconvert
! audioresample ! wavenc ! filesink location=foobar.wav
Die pcap-Datei enthält einen einzelnen Medienstrom RTP. Ich habe eine Capture-Datei erstellt, in der 50 der ursprünglichen 400 UDP-Datagramme fehlen. Für die gegebene Hörprobe (8s lang für mein Beispiel):
[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
mit einer bestimmten Menge von aufeinanderfolgenden Paketverlust ich ein Audiosignal wie dies erwarten würde ausgegeben werden (‚-
‘ bezeichnet Schweigen):
[XXXXXXXXXXXXXXXXXXXXXXXX-----XXXXXXXXXXX]
aber, was tatsächlich in der Audiodatei gespeichert ist dies (1 s für mein Beispiel kürzer):
[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
Es scheint, dass der Jitter-Buffer, ein entscheidender Teil für diese Anwendung ist funktioniert nicht richtig. Könnte das eine Inkompatibilität mit dem Element pcapparse
sein? Fehle ich einen wichtigen Teil in der Pipeline, um die Zeitsynchronisation sicherzustellen? Was könnte das sonst noch verursachen?
ich mit einem nackten Knochen Lösung leben können, das heißt einfach oder ohne Verlust Verschleierung. Was hier falsch ist, ist die Playout-Zeit. Nach einer weiteren Untersuchung scheint es sich tatsächlich um ein Problem mit 'pcapparse' bzw. der Zeitsynchronisation zwischen' pcapparse' und 'rtppcmudepay' zu handeln. Wenn ich 'udpsrc' als Quellelement verwende, funktioniert alles wie erwartet. – paprika