2010-03-05 127 views
3

我已經創建了一個java服務器,它可以截取屏幕截圖,調整它們大小,並通過TCP/IP將它們發送到我的iPhone應用程序。然後,應用程序使用NSInputStream收集傳入的圖像數據,使用字節緩衝區創建一個NSMutableData實例,然後創建一個UIImage對象以在iPhone上顯示。屏幕共享,本質上。我的iPhone的代碼來收集圖像數據目前情況如下:流式傳輸JPEG,檢測JPEG結束

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent{ 


if(streamEvent == NSStreamEventHasBytesAvailable && [iStream hasBytesAvailable]){ 
     uint8_t buffer[1024]; 

    while([iStream hasBytesAvailable]){ 
     NSLog(@"New Data"); 

     int len = [iStream read:buffer maxLength:sizeof(buffer)]; 

     [imgdata appendBytes:buffer length:len]; 
     fullen=fullen+len; 

     /*Here is where the problem lies. What should be in this 
     if statement in order to make it test the last byte of 
     the incoming buffer, to tell if it is the End of Image marker 
     for the end of incoming JPEG file? 
     */ 
     if(buffer[len]=='FFD9'){ 
     UIImage *img = [[UIImage alloc] initWithData:imgdata]; 
     NSLog(@"NUMBER OF BYTES: %u", len); 

     image.image = img; 
     } 
    } 

} 
} 

我的問題,通過在代碼註釋所示,是搞清楚何時停止在NSMutableData對象採集數據,並利用這些數據來創建一個UIImage。在傳入字節中尋找JPEG文件結尾標記 - 圖像結束(EOI)標記(FFD9)似乎是有意義的,因爲發送該圖像時將準備好顯示圖像。我該如何測試?我要麼丟失了關於如何存儲數據的內容,要麼關於JPEG文件中的標記,但是在測試中有任何幫助將不勝感激!

詹姆斯

+0

1)'buffer [len]'超過了它所讀取的塊的末尾,這只是'len'字節長(因此最後一個索引是'len-1'和2)''FFD9'是不是一個字節,它是4個字節;你可能是指'0xFFD9',它是2個字節,但你必須以某種方式讀取最後2個字節,而不是最後一個字節;然後你必須單獨測試字節,否則不得不擔心排序 – user102008 2011-04-29 21:59:54

回答

3

你顯然不希望關閉流,因爲這會殺了性能。

由於您控制客戶端服務器連接,請在發送圖像數據之前發送圖像中的字節數。更好的方法是,發送圖像中的字節數,圖像數據以及最後一個容易識別的序列號,以便快速驗證數據是否已實際到達。

比實際檢查文件標記結束更容易,更有效。雖然,當然,您也可以在接收到#字節後檢查它是否也是如此。很簡單。

當然,除了不常見的情況外,所有這些對於屏幕共享風格來說都是非常低效的。在大多數情況下,只有一小部分被鏡像的屏幕實際上隨着每一幀而改變。如果你試圖用每一幀發送整個屏幕,你很快就會飽和你的連接,客戶端將會變得非常遲緩而且沒有反應。

鑑於這是一個非常成熟的市場,有大量的解決方案和相當多的開源代碼位,您可以從中獲得適合您需求的解決方案(請參閱VNC)。

+0

所有偉大的建議,謝謝! – James 2010-03-06 16:59:05