package com.inspect.tcpserver.sip.gb28181; import java.net.*; import java.util.concurrent.atomic.AtomicInteger; public class RtpSenderEx { private final DatagramSocket socket; private final InetSocketAddress target; private final int ssrc; private final int payloadType; private final AtomicInteger seq = new AtomicInteger(0); public RtpSenderEx(String ip, int port, int ssrc, int pt) throws Exception { this.socket = new DatagramSocket(); this.target = new InetSocketAddress(ip, port); this.ssrc = ssrc; this.payloadType = pt; } // public void send(byte[] ps, long ts90k) { // int offset = 0; // while (offset < ps.length) { // int len = Math.min(1400, ps.length - offset); // byte[] rtp = buildRtp(ps, offset, len, ts90k); // socketSend(rtp); // offset += len; // } // } // // private byte[] buildRtp(byte[] ps, int off, int len, long ts) { // byte[] pkt = new byte[12 + len]; // pkt[0] = (byte) 0x80; // pkt[1] = (byte) payloadType; // pkt[2] = (byte) (seq.getAndIncrement() >> 8); // pkt[3] = (byte) seq.get(); // pkt[4] = (byte) (ts >> 24); // pkt[5] = (byte) (ts >> 16); // pkt[6] = (byte) (ts >> 8); // pkt[7] = (byte) ts; // pkt[8] = (byte) (ssrc >> 24); // pkt[9] = (byte) (ssrc >> 16); // pkt[10] = (byte) (ssrc >> 8); // pkt[11] = (byte) ssrc; // // System.arraycopy(ps, off, pkt, 12, len); // return pkt; // } public void sendOne(byte[] ps, long ts90k) { byte[] rtp = buildRtp(ps, ts90k, true); socketSend(rtp); } private byte[] buildRtp(byte[] payload, long ts, boolean marker) { byte[] pkt = new byte[12 + payload.length]; pkt[0] = (byte) 0x80; pkt[1] = (byte) (payloadType | (marker ? 0x80 : 0)); pkt[2] = (byte) (seq.get() >> 8); pkt[3] = (byte) seq.getAndIncrement(); pkt[4] = (byte) (ts >> 24); pkt[5] = (byte) (ts >> 16); pkt[6] = (byte) (ts >> 8); pkt[7] = (byte) ts; pkt[8] = (byte) (ssrc >> 24); pkt[9] = (byte) (ssrc >> 16); pkt[10] = (byte) (ssrc >> 8); pkt[11] = (byte) ssrc; System.arraycopy(payload, 0, pkt, 12, payload.length); return pkt; } private void socketSend(byte[] pkt) { try { socket.send(new DatagramPacket(pkt, pkt.length, target)); } catch (Exception ignored) {} } public void close() { socket.close(); } }