2016-08-06 2 views
0

DVR 및 IP 카메라에 스냅 샷을 요청하는 응용 프로그램을 개발 중입니다. 내가 일하고있는 장치는 RTSP 요청을 제공합니다. 그런 다음 스트림 패킷 수신을 시작하는 데 필요한 RTSP 방법을 구현했으며 UDP 연결을 통해 수신하기 시작했습니다. 의심의 여지가, 어떻게 jpeg 파일에받은 데이터를 저장할 수 있습니까? 이미지 바이트의 구걸과 끝은 어디에서 받았습니까?Java - RTSP 스트림 패킷에서 스냅 샷 저장

Xuggler (더 이상 유지 관리하지 않음), javacpp-presets - ffmpeg 및 opencv 라이브러리 포함 - Java에서 이러한 유형의 서비스를 구현하는 많은 라이브러리를 검색했습니다. 일부 환경 문제가있었습니다. 누군가가 스트림에서 스냅 샷을 저장하는 쉽고 좋은 것을 알고 있다면 알려주십시오.

내 코드 :

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 

출력 :

받은 : 80E0000100004650000000006742E01FDA014016C4의 L : 21 수신 : 80E00002000046500000000068CE30A480 L : 17 받은 : 상기 스트리밍 데이터의 톤 ... 수신 : 톤 ... 수신 된 스트리밍 데이터 수 ... [...]

당신이 생각하기에, 내가 잘못하고 있기 때문에 내가 파일에 저장하고있는 이미지는 읽을 수 없다. 나는 헤더가 스트리밍에서 이미지의 시작과 끝을 알려주는 다음 패킷에 대한 정보를 제공한다고 생각합니다. 그러나 나는 그들을 이해하지 못한다. 누군가 그것을 해결하는 방법을 알고 있습니까? 모든 팁을 환영합니다!

답변

0

먼저 RTP 페이로드 유형을 지정하지 않았습니다. jpeg, H.264 또는 다른 미디어 형식입니까? 페이로드를 감안할 때, 해당 rfc (this은 JPEG의 경우, this은 H.264의 경우)를 조회하고 RTP 패킷 스트림을 demux해야합니다.