2012-02-16 6 views
20

का उपयोग करके भेजा या प्राप्त नहीं किया जा रहा है मैं mjsip sip stack का उपयोग कर सॉफ्टफ़ोन प्रोजेक्ट पर काम कर रहा हूं। एमजेएसआईपी केवल जी 711 या पीसीएमए/पीसीएमयू कोडेक का समर्थन करता है। मैंने अपनी परियोजना में जी 72 9 जोड़ा है। जब मैं प्रोजेक्ट का निर्माण करता हूं तो यह कोई त्रुटि नहीं दिखाता है। लेकिन जब फोन कनेक्ट हो जाते हैं तो कॉल स्थापित हो जाता है वहां कोई आवाज संचार नहीं होती है, वास्तव में मेरा ऐप किसी भी आरटीपी पैकेट उत्पन्न नहीं करता है। और लॉग मेंआरटीपी पैकेट्स mjsip

java.lang.NullPointerException 
RtpStreamReceiver - run -> Terminated. 
    at local.media.RtpStreamReceiver.run(RtpStreamReceiver.java:171) 

जैसी कोई त्रुटि दिखाई देती है, तो मैं बग खोजने में विफल रहा हूं।

यहां मेरा आरटीपीस्ट्रीम रिसीवर.जावा वर्ग है।

package local.media; 

import local.net.RtpPacket; 
import local.net.RtpSocket; 
import java.io.*; 
import java.net.DatagramSocket; 
import org.flamma.codec.SIPCodec; 

/** RtpStreamReceiver is a generic stream receiver. 
    * It receives packets from RTP and writes them into an OutputStream. 
    */ 

public class RtpStreamReceiver extends Thread { 

    public static int RTP_HEADER_SIZE = 12; 
    private long start = System.currentTimeMillis(); 
    public static final int SO_TIMEOUT = 200; // Maximum blocking time, spent waiting for reading new bytes [milliseconds] 
    private SIPCodec sipCodec = null; // Sip codec to be used on audio session 
    private RtpSocket rtp_socket = null; 
    private boolean socketIsLocal = false;  // Whether the socket has been created here 
    private boolean running = false; 
    private int timeStamp = 0; 
    private int frameCounter = 0; 
    private OutputStream output_stream; 

    public RtpStreamReceiver(SIPCodec sipCodec, OutputStream output_stream, int local_port) 
    { 
     try { 
      DatagramSocket socket = new DatagramSocket(local_port); 

      socketIsLocal = true; 

      init(sipCodec, output_stream, socket); 

      start = System.currentTimeMillis(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    public RtpStreamReceiver(SIPCodec sipCodec, OutputStream output_stream, DatagramSocket socket) 
    { 
     init(sipCodec, output_stream, socket); 
    } 


    /** Inits the RtpStreamReceiver */ 

    private void init(SIPCodec sipCodec, OutputStream output_stream, DatagramSocket socket) 
    { 
     this.sipCodec = sipCodec; 
     this.output_stream = output_stream; 

     if (socket != null) { 
      rtp_socket = new RtpSocket(socket); 
     } 
    } 


    /** Whether is running */ 

    public boolean isRunning() 
    { 
     return running; 
    } 


    /** Stops running */ 

    public void halt() 
    { 
     running = false; 
    } 

    /** Runs it in a new Thread. */ 

    public void run() 
    { 
     if (rtp_socket == null) 
     { 
      println("run", "RTP socket is null."); 
      return; 
     } 

     byte[] codedBuffer = new byte[ sipCodec.getIncomingEncodedFrameSize() ]; 
     byte[] internalBuffer = new byte[sipCodec.getIncomingEncodedFrameSize() + RTP_HEADER_SIZE ]; 

     RtpPacket rtpPacket = new RtpPacket(internalBuffer, 0); 

     running = true; 

     try { 

      rtp_socket.getDatagramSocket().setSoTimeout(SO_TIMEOUT); 

      float[] decodingBuffer = new float[ sipCodec.getIncomingDecodedFrameSize() ]; 
      int packetCount = 0; 

      println("run", 
        "internalBuffer.length = " + internalBuffer.length 
        + ", codedBuffer.length = " + codedBuffer.length 
        + ", decodingBuffer.length = " + decodingBuffer.length + "."); 

      while (running) { 

       try { 
        rtp_socket.receive(rtpPacket); 
        frameCounter++; 

        if (running) { 

         byte[] packetBuffer = rtpPacket.getPacket(); 
         int offset = rtpPacket.getHeaderLength(); 
         int length = rtpPacket.getPayloadLength(); 
         int payloadType = rtpPacket.getPayloadType(); 
         if(payloadType < 20) 
         { 
       System.arraycopy(packetBuffer, offset, codedBuffer, 0, sipCodec.getIncomingEncodedFrameSize()); 
           timeStamp = (int)(System.currentTimeMillis() - start); 
       output_stream.write(codedBuffer,offset,length); 
         } 
        } 
       } 
       catch (java.io.InterruptedIOException e) { 
       } 
      } 
     } 
     catch (Exception e) { 

      running = false; 
      e.printStackTrace(); 
     } 

     // Close RtpSocket and local DatagramSocket. 
     DatagramSocket socket = rtp_socket.getDatagramSocket(); 
     rtp_socket.close(); 

     if (socketIsLocal && socket != null) { 
      socket.close(); 
     } 

     // Free all. 
     rtp_socket = null; 

     println("run", "Terminated."); 
    } 


/** Debug output */ 
private static void println(String method, String message) { 

    System.out.println("RtpStreamReceiver - " + method + " -> " + message); 
} 

और लाइन 171 है: output_stream.write(codedBuffer,offset,length);

आप रुचि रखते हैं here पूर्ण परियोजना स्रोत है।

+1

अधिकतर एनपीई 'output_stream' के कारण होता है जब 'RtpStreamReceiver' थ्रेड चल रहा है। यह पता लगाने के लिए कि क्या यह मामला है, मैं 'println' का उपयोग करूंगा। – gnat

+0

सॉकेट बाध्य (बाइंड()) या खोला गया है, या आरटीपी सॉकेट क्लास आपके लिए यह संभालता है? – EdH

+0

क्या आप इसे काम कर रहे थे? क्या आप अपनी परियोजना को दोबारा अपलोड कर सकते हैं? – B770

उत्तर

2

जैसा कि @gnat ने टिप्पणी में कहा - सबसे अधिक संभावना output_stream शून्य है।

यदि ऐसा है तो आपको जांच करनी चाहिए क्यों। एक कारण यह हो सकता है कि:

private void init(SIPCodec sipCodec, OutputStream output_stream, DatagramSocket socket)

अशक्त पैरामीटर के साथ कहा जाता है और यह एक मूल्य से पहले सही ढंग से स्थापित किया जा रहा ओवरराइड करता है कि।

आप लॉग इन कर सकते 'कौन' init में पहली पंक्ति के रूप में निम्नलिखित करने के द्वारा किसी विशेष समारोह कहा जाता है:

System.out.println("My function is called from: " 
+ Thread.currentThread().getStackTrace()[2].getClassName() + "." 
+ Thread.currentThread().getStackTrace()[2].getMethodName()); 
0

संचारित आवाज के लिए आरटीपी जावा मीडिया ढांचे का उपयोग करने के लिए महान का उपयोग कर। ओरेकल की वेबसाइट से आप jmf.exe प्राप्त कर सकते हैं। और आप उस एपीआई का उपयोग करके आवाज संचारित कर सकते हैं। संचारित आवाज की कोडिंग भी उपलब्ध है।

संबंधित मुद्दे