2013-02-07 43 views
0

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

我们正处在一个Java项目的工作,我们有学生:

  1. 捕获从视频流一个摄像头
  2. 合并这个流与一个视频文件(我们取每个像素的颜色的平均值,所以这两个流是叠加的)
  3. 使用RTP或RTSP在网络上传输合并结果(理论上,一世t将被2个Android平板电脑接收)。

有一点非常重要,那就是所有这些操作都应该是实时(或差不多)。应在网络摄像头捕捉视频的同时接收RTP流。

为了做到这一点,我们使用Java媒体框架(JMF)API。第一个和第二个点已经成功实施:来自网络摄像头的每秒秒数,来自视频文件的30 BufferedImage合并到网络摄像头的BufferedImage。结果显示在一个经典的JFrame上(我们只使用Swing和JMF),它的效果非常好。

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

在此先感谢您的帮助。

回答

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头(例如你的databuffer中的前12个字节)。这很简单,如果你知道每一位属于哪里。

根据您的图像编码方式,您可能需要警惕额外的需求。例如,通过RTP发送Jpeg时,必须删除完整的Jpeg标题并创建缩写RTP/Jpeg标题,并将其放在RTP标题和有效内容之间。接收器将不得不从缩略标题重新创建Jpeg标题。对于Jpeg,如果尚未存在,请确保将EOI标记添加到图像中。我认为在这方面ffmpeg可以为你做很多工作,如果你敢于潜入JNI的话。

有关如何定制RTP有效负载的更多信息,请参阅this

干杯 〜