2013-04-11 58 views
2

我想用Java中的UDP DatagramPacket將從磁盤讀取的視頻文件傳輸到接收器。UDP上的視頻文件包 - 增量讀取和流

要點如下:雖然將要發送的文件是從磁盤中讀取,我應該以爲我不知道該文件的大小。總文件需要逐步讀取,並且文件的數據報包應具有不同的大小。

總之,我認爲我是一個流媒體視頻直播到接收器不知道我有多少數據將完全需要發送,並在何種速率的數據將得到生成。

現在,我有一次讀取磁盤上的文件,並轉換成數據包的數據包使用UDP套接字發送代碼。但我不知道如何在不知道原始文件大小的情況下對文件進行打包,並逐漸讀取模擬實時視頻流的文件。

上得到這個想法使用Java將是非常有用的實現任何輸入。一旦我得到這個基本的東西的工作,我需要實現一個實時文件傳輸協議。

發信人:

 File file = new File("/crazy.mp4"); 
     FileInputStream fis = new FileInputStream(file); 
     DatagramPacket pack; 


     int size = 0; 
     byte[] buffer = new byte[((int) file.length())]; 
     ByteBuffer bb = ByteBuffer.allocate(4); 
     bb.order(ByteOrder.BIG_ENDIAN); 

     while (true) { 
      size = fis.read(buffer);     
      pack = new DatagramPacket(buffer, buffer.length, address, 
        packet.getPort()); 
      socket.send(pack); 
     } 

接收機:

 File file = new File("/crazyRecv.mp4"); 
    FileOutputStream fos = new FileOutputStream(file); 
    DatagramPacket rpacket = new DatagramPacket(buffer, buffer.length); 

     while (true) { 
      socket.receive(rpacket); 
      fos.write(rpacket.getData(), 0, rpacket.getLength()); 
     } 

感謝。

+0

告訴我們你的代碼。 – Raptor 2013-04-11 04:33:16

+1

@Shivan:請檢查問題的修改版本的代碼片段 – arun 2013-04-11 04:41:42

回答

2

發送和接收UDP數據包不能保證成功地重新創建客戶端文件的這段代碼。

  1. UDP是不可靠的 - 沒有像TCP那樣的低級別確認和數據包重傳機制,所以你必須實現這一點。數據包可能會丟失,並在客戶端沒有收到
  2. UDP是不連續的 - 你不能只是指望UDP報文以依次客戶端收到。第一個數據包可能先到達最後一個數據包,然後再破壞文件。 TCP保證順序交付。

你必須編寫自己的應用層協議,如果你仍然想使用。例

  1. 您發送的內容包「文件開始」
  2. 客戶端發送一個ACK數據包爲「文件開始:收到」
  3. 如果您沒有收到「文件開始:收到」那麼你必須去到步驟1
  4. ,然後用獨特的ID「包1」 +發送數據包分組數據
  5. 客戶端發送一個ACK報文,認爲「包1:收到」
  6. 如果你沒」 t收到「數據包1:收到」,那麼你必須去一步4
  7. 執行步驟4 - 6所有數據包
  8. 您的內容「文件結束」
  9. 客戶端發送一個ACK數據包爲發送數據包「文件結束:收到」
  10. 如果你沒有收到「文件結束:收到」,那麼你必須去第8步
+0

是啊,我知道,UDP是不可靠的傳輸協議。我打算通過UDP編寫可靠的文件傳輸協議,一旦我得到這個分組化的東西的工作。我的文件傳輸協議允許重傳丟失的數據包。根據我提到的要求打包文件的任何輸入都會有很大的幫助。 – arun 2013-04-11 05:47:22

+0

那麼發送開始和結束文件包可以標記開始和結束。那麼現在你需要知道文件預先存在多久了? – shazin 2013-04-11 05:49:27

+0

由於以下要求,我無法預測文件長度(即使我從磁盤讀取文件):我應該假設我將實況視頻流式傳輸到接收器,而不知道我將完全需要發送多少數據在何種速率的數據將得到產生 – arun 2013-04-11 05:52:29