Aber wenn das "ein grundsätzliches Problem" von Asterisk ist, dann lasse ich es wohl so.
Ich glaube, dass ich mich etwas missverständlich ausgedrückt habe: es ist ein grundsätzliches Problem, dass Asterisk unter bestimmten Umständen sinnlos transkodiert - das führt aber nicht dazu, dass es zu akustischen Problemen kommt - es ist einfach nur sinnlos. Und ich möchte damit sagen, dass Ein- und ausgehende Gespräche (auch bei gleichen TN) unter bestimmten Umständen unterschiedlich behandelt werden und nicht gleich - das ist die Botschaft und das erklärt, warum es bei Dir in eine Richtung geht und nicht in die andere - was üblicherweise aber nicht so ist!
Da Du mit pjsip unterwegs bist, kannst Du in Asterisk selbst wie folgt tracen:
als root in der Shell eingeben:
Code:
asterisk -x "pjsip set logger on"
asterisk -x "pjsip set logger verbose off"
asterisk -x "pjsip set logger pcap trace.pcap"
In /var/lib/asterisk/ findest Du dann die Datei trace.pcap (zumindest bei mir). Du musst u.U. ziemlich lange warten, bis der Callflow in der Datei enthalten ist. Am besten für "Bewegung" sorgen (sprich noch einen weiteren Callversuch machen).
Die kannst Du dann mit sngrep oder auch wireshark auswerten. Wichtig ist, was in Sachen Codecaushandlung / SDP zu erkennen ist - sowohl Richtung lokalem Device als auch zum Provider hin. Einmal die Fehlersituation und einmal die OK-Situation vergleichen. Im Internet findet man Hinweise, wie man Callflows mit sngrep oder Wireshark auswertet - ich habe hierzu hier auch schon das eine oder andere geschrieben.
Ziel ist herauszufinden, was konkret in der einen Richtung, wo es nicht geht, passiert und welche Codecs hier zum Einsatz kommen bei den beteiligten Devices.
Auf die Schnelle könntest Du es auch so herausbekommen (ohne Trace - aber brauchen werden wir den u.U. trotzdem - um die Details zu sehen):
Code:
# asterisk -x "pjsip show channelstats"
...........Receive......... .........Transmit..........
BridgeId ChannelId ........ UpTime.. Codec. Count Lost Pct Jitter Count Lost Pct Jitter RTT....
===========================================================================================================
db17aad9 100-0000003f 00:00:10 g722 478 0 0 0.000 482 0 0 0.000 0.000
db17aad9 telekomPJSIP 00:00:10 alaw 484 0 0 0.000 478 0 0 0.001 0.000
Da siehst Du dann übrigens auch gleich, ob evtl. Pakete verloren gehen.
Zu sehen sind hier die beiden zusammengehörenden Calllegs: der erste Eintrag ist das lokale Device (vom lokalen Telefon zu Asterisk) - der zweite der zugehörige ausgehende Call - hier von Asterisk zur Telekom.
Es ist auch zu erkennen, dass nach innen G722 verwendet wird und nach Außen G711 (alaw). Hier wird sinnloserweise zwischen G711 und G722 transcodiert - obwohl nach innen G711 genauso erlaubt wäre. Dies ist übrigens ein ausgehendes Gespräch. Wäre das ein eingehendes Gespräch, wäre auf beiden Seiten G711 zu finden (das ist das grundsätzliche besagte Problem von Asterisk, dass die Codecaushandlung richtungsabhängig ist, wodurch es dann zu der Situation kommt, falls die Codecwünsche auf den beiden Seiten differieren).
Ergänzung:
Eine weitere recht elegante Methode, an die einzelnen SIP-Messages zu kommen, ist das
pjsip history - Feature. Setzt allerdings noch viel mehr voraus, dass man das angezeigte Ergebnis versteht - es gibt da keine Auswertehilfen / Interpretationstools dafür. Für die, die SIP verstehen, ist das ein durchaus mächtiges Tool, weil es für erste belastbare Ergebnisse den geringsten Aufwand erzeugt.
Im Prinzip sollte man den weiter oben erwähnten Logger grundsätzlich mitlaufen lassen, um jederzeit eine Retrospektive zu haben, um "Auffälligkeiten" nachträglich analysieren zu können und auf Basis dessen bei Bedarf weitere, tiefere Traces (inkl. rtp z.B.) zu aktivieren.
Ein anderes mächtiges Tool ist auch
pcapsipdump (zum
Erfassen der relevanten Pakete). Nachteil hier ist allerdings, dass es nur für unverschlüsselte SIP-UDP-Pakete brauchbar ist.