簡體   English   中英

Java-RTSP從流數據包保存快照

[英]Java - RTSP save snapshot from Stream Packets

我正在開發一個向DVR和IP攝像機請求快照的應用程序。 我正在使用的設備僅提供RTSP請求即可。 然后,我實施了必要的RTSP方法以開始接收流數據包,然后開始通過建立的UDP連接進行接收。 我的疑問是,如何將接收到的數據保存到jpeg文件中? 收到的圖像字節的乞討和結尾在哪里?

我搜索了很多在Java中實現此類服務的庫,例如Xuggler(不再維護),javacpp-presets(包括ffmpeg和opencv庫)-我遇到了一些環境問題。 如果有人知道一種簡單而又好用的方法,可以從流中保存快照,請告訴我。

我的代碼:

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已接收:來自流式傳輸的數據量...已接收:來自流式傳輸的數據量...已接收:來自流式傳輸的數據量... [...]

您可能會想,我保存到文件中的圖像不可讀,因為我做錯了。 我認為標頭為我提供了有關服務器將向我發送的下一個數據包的一些信息,告訴了來自流的圖像的開始和結束。 但是我不明白他們。 有人知道如何解決嗎? 歡迎任何提示!

首先,您沒有指定什么是RTP有效負載類型-是jpeg,H.264還是其他某種媒體格式? 給定有效負載后,您必須查找相應的rfc( 為JPEG, 為H.264)並解復用RTP數據包流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM