您好,
我们是学习Java项目的学生,我们必须:
有一件事非常重要,那就是所有这些操作都应该实时(或几乎)。应在网络摄像头捕获视频的同一时间接收RTP流。
为此,我们使用Java Media Framework(JMF)API。第一和第二点已成功实施:来自网络摄像头的每秒30 BufferedImage 与来自视频文件的30 BufferedImage 合并。结果显示在经典的JFrame上(我们只使用Swing和JMF),效果非常好。
我们仍然要做第三点。通过RTP发送视频流并不是很难。 但问题是:由于第1点和第2点,我们没有视频流,而是一系列BufferedImages。我们知道如何从这些BufferedImage获取视频文件。但它只是录制在硬盘上的视频文件,无法实时在网络上发送。那么我们如何从这些可以通过RTP直接发送的BufferedImage中创建一个动态流?
提前感谢您的帮助。
答案 0 :(得分:1)
我想改进我的答案。
首先,您是否真的必须使用RTP / RTSP。如果您不需要,您可以通过DatagramSocket发送图像数据,并假设接收器知道如何解码它们。使用像
这样的东西DatagramSocket socket = new DatagramSocket(port);
DatagramPacket packet = new DatagramPacket(new byte[1], 1);
packet.setAddress(receiver.getAddress());
packet.setPort(port);
while(running)
{
byte[] data = getMergedImageData();
packet.setData(data);
packet.setLength(data.length);
socket.send(packet);
}
如果必须使用RTP,您应该查看mjsip项目。基本上你必须创建一个有效的RTP头(例如数据缓冲区中的前12个字节)。如果您知道每个位所属的位置,这很简单。
根据您对图像的编码方式,您可能需要警惕其他要求。例如,当通过RTP发送Jpeg时,您必须删除完整的Jpeg标头并创建缩写的RTP / Jpeg标头并将其放在RTP标头和有效负载之间。接收方必须从缩写标题重新创建Jpeg标头。对于Jpeg,还要确保在图像中添加EOI标记(如果尚未存在)。我认为,如果你敢于深入JNI,ffmpeg可以为你做很多工作。
有关如何定制RTP有效负载的更多信息,请参阅this。
干杯 〜