2013-02-07 42 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

乾杯 〜