有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

opencv Java RTSP从流数据包保存快照

我正在开发一个向DVR和IP摄像头请求快照的应用程序。我正在使用的设备只提供RTSP请求。然后我实现了必要的RTSP方法来开始接收流数据包,然后我开始通过建立的UDP连接接收流数据包。我的疑问是,如何将接收到的数据保存到jpeg文件中?收到的图像字节的请求和结尾在哪里

我搜索了很多用Java实现这类服务的库,比如Xuggler(不再维护)、javacpp预设(包括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

输出:

收到:80E00001406500000006742E01FDA014016C4 L:21 收到:80E000020000460000000068CE30A480 L:17 收到:来自流媒体的大量数据。。。 收到:来自流媒体的大量数据。。。 收到:来自流媒体的大量数据。。。 [...]

你可能会想,我保存到文件中的图像是不可读的,因为我做得不对我认为标题为我提供了一些关于服务器将发送给我的下一个数据包的信息,告诉我流媒体图像的开始和结束。但我不明白。有人知道怎么解决吗?欢迎提供任何建议


共 (1) 个答案

  1. # 1 楼答案

    首先,您没有指定什么是RTP有效负载类型——是jpeg、H.264还是其他媒体格式?给定有效载荷,您必须查找相应的rfc(this一个用于JPEG,this一个用于H.264)并解复用RTP数据包流