JMF - Problem beim Senden und Empfangen von RTCP (RR) Paketen

tanerc

Grünschnabel
Hallo,

ich versuche gerade eine Software zu schreiben, die RTP Daten austauscht und mittels RTCP die Verbindungsqualität überwacht. Bisher funktioniert die Verbindungsaufbau, der RTP Datenaustausch und teilweise RTCP.

Jedoch beim RTCP werden nur SenderReports ausgetauscht und keine ReceiverReports. Die Übertragung übernimmt die folgende Methode, die ich anhand Beispielen implementiert habe. callParameter enthält IP, Port und Payloadtype, die mittels sip ausgehandelt wurden.

Code:
public int transmitData(CallParameter callParameter) {
        int value = 0;
        try {
            myProcessor = Manager.createProcessor(iDS);
            myProcessor.configure();

            while (myProcessor.getState() != Processor.Configured) {
                try {
                    Thread.sleep(20);
                } catch (InterruptedException ex) {
                    return -1;
                }
            }

            myProcessor.setContentDescriptor(new ContentDescriptor(ContentDescriptor.RAW));
            track = myProcessor.getTrackControls();

            switch (callParameter.getPayloadType()) {
                case 0:
                    af = new AudioFormat(AudioFormat.ULAW_RTP, 8000, 8, 1);
                    break;
                case 3:
                    af = new AudioFormat(AudioFormat.GSM_RTP, 8000, 4, 1);
                    break;
                case 8:
                    //TODO: aLaw
                    break;
            }

            AudioFormat f = (AudioFormat) track[0].getFormat();
            if (!f.equals(af)) {
                track[0].setFormat(af);
            }

            myProcessor.realize();
            while (myProcessor.getState() != Processor.Realized) {
                try {
                    Thread.sleep(20);
                } catch (InterruptedException ex) {
                }
            }

            oDs = myProcessor.getDataOutput();

            // com.sun.media.rtp.RTPSessionMgr
            myRTPSessionMgr = new RTPSessionMgr();
            
            SessionAddress senderAddr = new SessionAddress();
            myRTPSessionMgr.initSession(senderAddr, null, 0.5, 0.25);

            myRTPSessionMgr.addSendStreamListener(this);
            myRTPSessionMgr.addRemoteListener(this);
            myRTPSessionMgr.addReceiveStreamListener(this);
            myRTPSessionMgr.addSessionListener(this);

            InetAddress destAddr = InetAddress.getByName(callParameter.getRemoteIP());
            InetAddress srcAddr = InetAddress.getByName(callParameter.getLocalIP());

            SessionAddress localAddr = new SessionAddress(srcAddr, callParameter.getLocalRTPPort(), srcAddr, callParameter.getLocalRTPPort() + 1);
            SessionAddress remoteAddr = new SessionAddress(destAddr, callParameter.getRemotePort(), destAddr, callParameter.getRemotePort() + 1);

            value = myRTPSessionMgr.startSession(localAddr, localAddr, remoteAddr, null);
            ss = myRTPSessionMgr.createSendStream(oDs, 0);
            ss.start();
            myProcessor.start();
        }...
}

Hat jemand vielleicht eine Idee woran es liegen könnte, dass keine RR ausgetauscht werden ?

Gruß
Taner
 
Hallo,

http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/guide/RTPArchitecture.html

"....You control the transmission through the SendStream start and stop methods.
When it is first started, the SessionManager behaves as a receiver (sends out RTCP receiver reports). As soon as a SendStream is created, it begins to send out RTCP sender reports and behaves as a sender host as long as one or more send streams exist. If all SendStreams are closed (not just stopped), the session manager reverts to being a passive receiver...."

Gruß
Taner
 
Zurück