2016-08-06 49 views
0

Ich entwickle eine Anwendung, die Schnappschüsse an DVR und IP-Kameras anfordert. Das Gerät, an dem ich gerade arbeite, bietet dazu RTSP-Anfragen an. Dann habe ich die notwendigen RTSP-Methoden implementiert, um mit dem Empfang der Stream-Pakete zu beginnen und habe dann angefangen, über UDP-Verbindung zu empfangen. Mein Zweifel ist, wie kann ich die empfangenen Daten in eine JPEG-Datei speichern? Wo ist das Betteln und Ende der Bildbytes?Java - RTSP Schnappschuss von Stream-Paketen speichern

Ich suchte viele Bibliotheken, die diese Art von Service in Java implementieren, wie Xuggler (die es nicht mehr verwaltet), javacpp-presets - hat ffmpeg und opencv-Bibliotheken enthalten - ich hatte einige Umgebungsprobleme damit. Wenn jemand eine einfache und gute kennt, die Schnappschüsse aus den Streams speichert, lassen Sie es mich wissen.

Mein Code:

final long timeout = System.currentTimeMillis() + 3000; 

byte[] fullImage = new byte[ 1024 * 1024 ]; 
DatagramSocket udpSocket = new DatagramSocket(8000); 
int lastByte = 0; 

// Skip first 2 packets because I think they are HEADERS 
// Since I don't know what they mean, I just print then in hexa 
for(int i = 0; i < 2; i++){ 

    byte[] buffer = new byte[ 1024 ]; 
    DatagramPacket dataPacket = new DatagramPacket(buffer, buffer.length); 
    udpSocket.receive(dataPacket); 

    int dataLenght = dataPacket.getLength(); 
    buffer = Arrays.copyOf(buffer, dataLenght); 

    System.out.println("RECEIVED[" + DatatypeConverter.printHexBinary(buffer) + " L: " + dataLenght); 

} 

do{ 

    byte[] buffer = new byte[ 1024 ]; 
    DatagramPacket dataPacket = new DatagramPacket(fullImage, fullImage.length); 
    udpSocket.receive(dataPacket); 

    System.out.println("RECEIVED: " + new String(fullImage)); 

    for(int i = 0; i < buffer.length; i++){ 
     fullImage[ i + lastByte ] = buffer[ i ]; 
     lastByte ++; 

    } 

} while(System.currentTimeMillis() < timeout); 
// I know this timeout is wrong, I should stop after getting full image bytes 

Die Ausgabe:

erhalten: 80E0000100004650000000006742E01FDA014016C4 L: 21 erhalten: 80E00002000046500000000068CE30A480 L: 17 erhalten: Tonnen von Daten aus dem Streaming ... erhalten: Ton Daten aus dem Streaming ... EMPFANGEN: Tonnen von Daten aus dem Streaming ... [...]

Wie Sie vielleicht annehmen, ist das Bild, das ich in eine Datei speichere, nicht lesbar, weil ich es falsch mache. Ich denke, der Header bieten mir einige Informationen über die nächsten Pakete der Server wird mir gesendet sagen, den Beginn und das Ende des Bildes aus dem Streaming. Aber ich habe sie nicht verstanden. Jemand weiß, wie man es löst? Irgendwelche Tipps sind willkommen!

Antwort

0

Zuerst haben Sie nicht spezifiziert, was der RTP-Payload-Typ ist - ist es JPEG, H.264 oder ein anderes Medienformat? Angesichts der Nutzlast müssen Sie die entsprechende RFC (this eine ist für JPEG, this eine für H.264) suchen und den RTP-Paketstrom demuxen.