package com.inspect.tcpserver.sip.gb28181; import java.net.*; import java.util.concurrent.atomic.AtomicInteger; public class RtpSender { private static final int RTP_HEADER_SIZE = 12; private static final int MTU = 1400; private final DatagramSocket socket; private final InetAddress remote; private final int port; private final int ssrc; private final AtomicInteger seq = new AtomicInteger(0); private int timestamp = 0; public RtpSender(DatagramSocket socket, InetAddress remote, int port, int ssrc) { this.socket = socket; this.remote = remote; this.port = port; this.ssrc = ssrc; } public void send(byte[] ps, boolean marker) throws Exception { int offset = 0; while (offset < ps.length) { int size = Math.min(MTU, ps.length - offset); byte[] pkt = new byte[RTP_HEADER_SIZE + size]; pkt[0] = (byte) 0x80; pkt[1] = (byte) (96 | (marker ? 0x80 : 0x00)); pkt[2] = (byte) (seq.get() >> 8); pkt[3] = (byte) (seq.getAndIncrement()); timestamp += 3600; pkt[4] = (byte) (timestamp >> 24); pkt[5] = (byte) (timestamp >> 16); pkt[6] = (byte) (timestamp >> 8); pkt[7] = (byte) (timestamp); pkt[8] = (byte) (ssrc >> 24); pkt[9] = (byte) (ssrc >> 16); pkt[10] = (byte) (ssrc >> 8); pkt[11] = (byte) (ssrc); System.arraycopy(ps, offset, pkt, RTP_HEADER_SIZE, size); socket.send(new DatagramPacket(pkt, pkt.length, remote, port)); offset += size; } } }