2012-02-16 18 views
20

Tôi đang làm việc trên một dự án softphone bằng cách sử dụng ngăn xếp mjsip sip. Mjsip chỉ hỗ trợ codec g711 hoặc PCMA/PCMU. Tôi đã thêm G729 vào dự án của mình. Khi tôi xây dựng dự án nó cho thấy không có lỗi. Nhưng khi các điện thoại được kết nối với nó cuộc gọi được thiết lập không có tiếng nói truyền, thực sự ứng dụng của tôi không tạo ra bất kỳ gói rtp nào. Và trong nhật ký có một lỗi nhưCác gói RTP không được gửi hoặc nhận bằng cách sử dụng mjsip

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

Tôi đã không tìm thấy lỗi.

Đây là lớp RtpStreamReceiver.java của tôi.

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); 
} 

Và dòng 171 là: output_stream.write(codedBuffer,offset,length);

Nếu bạn quan tâm here là nguồn dự án đầy đủ.

+1

NPE có khả năng nhất là do 'output_stream' bị vô hiệu khi chuỗi' RtpStreamReceiver' đang chạy. Tôi sẽ sử dụng 'println' để tìm hiểu xem đây có phải là trường hợp không. – gnat

+0

là socket bị ràng buộc (bind()) hoặc được mở hoặc lớp RtpSocket xử lý điều này cho bạn? – EdH

+0

Bạn có làm cho nó hoạt động không? Bạn có thể tải lại dự án của mình không? – B770

Trả lời

2

Như @gnat đã nói trong nhận xét - rất có thể output_stream là không.

Nếu trường hợp đó xảy ra, bạn nên kiểm tra lý do. Một lý do có thể là:

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

được gọi với tham số rỗng và nó sẽ ghi đè giá trị là chính xác thiết lập trước đó.

Bạn có thể đăng nhập 'người' được gọi là một chức năng cụ thể bằng cách đặt sau khi dòng đầu tiên trong init:

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

Đối với giọng nói truyền sử dụng RTP Java khuôn khổ đa phương tiện tuyệt vời để sử dụng. từ trang web của oracle u có thể nhận được jmf.exe. Và u có thể truyền giọng nói bằng cách sử dụng Api đó. coading của truyền giọng nói cũng có sẵn.

Các vấn đề liên quan