gpt4 book ai didi

java - 没有使用 mjsip 发送或接收 RTP 数据包

转载 作者:IT老高 更新时间:2023-10-28 20:54:50 33 4
gpt4 key购买 nike

我正在使用 mjsip sip 堆栈开发一个软件电话项目。 Mjsip 仅支持 g711 或 PCMA/PCMU 编解码器。我已将 G729 添加到我的项目中。当我构建项目时,它没有显示错误。但是当电话连接起来时,调用就建立起来了,没有语音传输,实际上我的应用程序不会生成任何 rtp 数据包。并且在日志中显示类似

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

我没有找到错误。

这是我的 RtpStreamReceiver.java 类。

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是完整的项目源代码。

最佳答案

正如@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());

关于java - 没有使用 mjsip 发送或接收 RTP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307084/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com