我正在开发一个请求快照到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
输出:RECEIVED: 80E0000100004650000000006742E01FDA014016C4 L: 21收到:80e00002000046500000000068ce30a480 1: 17收到:来自流媒体的大量数据…收到:来自流媒体的大量数据…收到:来自流媒体的大量数据…[…]
您可能会想到,我保存到文件中的图像是不可读的,因为我做错了。我认为报头为我提供了一些关于服务器将向我发送的下一个数据包的信息,告诉我流媒体图像的开始和结束。但我不理解他们。有人知道怎么解吗?欢迎任何建议!
首先你没有指定什么是RTP有效载荷类型-是jpeg, H.264还是其他媒体格式?给定有效负载,您必须查找相应的rfc(这个用于JPEG,这个用于H.264)并删除RTP数据包流。