合并网络摄像头流和视频文件,并通过RTP或RTSP发送结果

时间:2013-02-07 21:52:10

标签: java video stream rtp jmf

您好,

我们是学习Java项目的学生,我们必须:

  1. 从网络摄像头捕获视频流
  2. 将此流与视频文件合并(我们采用每个像素的平均颜色,因此叠加两个流)
  3. 使用RTP或RTSP在网络上传输此合并的结果(理论上,它将由2个Android平板电脑接收)。
  4. 有一件事非常重要,那就是所有这些操作都应该实时(或几乎)。应在网络摄像头捕获视频的同一时间接收RTP流。

    为此,我们使用Java Media Framework(JMF)API。第一和第二点已成功实施:来自网络摄像头的每秒30 BufferedImage 与来自视频文件的30 BufferedImage 合并。结果显示在经典的JFrame上(我们只使用Swing和JMF),效果非常好。

    我们仍然要做第三点。通过RTP发送视频流并不是很难。 但问题是:由于第1点和第2点,我们没有视频流,而是一系列BufferedImages。我们知道如何从这些BufferedImage获取视频文件。但它只是录制在硬盘上的视频文件,无法实时在网络上发送。那么我们如何从这些可以通过RTP直接发送的BufferedImage中创建一个动态流?

    提前感谢您的帮助。

1 个答案:

答案 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

干杯 〜