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 đủ.
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
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
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