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