Java - 从流数据包中保存 RTSP 快照

标签 java opencv ffmpeg rtsp

我正在开发一个向 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
收到:来自流媒体的大量数据...
收到:来自流媒体的大量数据...
收到:来自流媒体的大量数据...
[...]

正如您可能猜想的那样,我保存到文件中的图像不可读,因为我做错了。我认为 header 为我提供了一些有关服务器将发送给我的下一个数据包的信息,告诉我来自流媒体的图像的开始和结束。但我不理解他们。有人知道如何解决吗?欢迎任何提示!

最佳答案

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

关于Java - 从流数据包中保存 RTSP 快照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38808298/

相关文章:

c++ - 生成文件错误 3

windows - FFMPEG - 批量转换子文件夹

html - m3u8 文件可以有 mp4 文件 url 吗?

python - 是否可以将提取的 'img%d.jpg' 图像从 ffmpeg 传输到另一个软件而不将图像保存在任何地方?

java - ButterKnife onclick 不起作用

java - 无法理解如何创建链表数组

java - DOM XML Public Doctype 未出现在结果 xml 文件中

python - 如何使用OpenCV消除此图像中的噪点?

java - 非常精确的线检测,openCV Java

java - 标记非数据库字段 @Transient 与范围 JPA 实体?