2015-05-27 27 views
0

我有一個需要從服務器流式傳輸並在屏幕上顯示流式內容...流使用NSStream和NSInputStream和NSOutputStream。如何可以顯示它在屏幕?通過流獲取幀並在屏幕上顯示

流用看起來像@ 「http://191.168.143.41:1212/;

  if(stream == inputStream) { 

      uint8_t buf[1024]; 
      unsigned int len = 0; 

      len = [inputStream read:buf maxLength:1024]; 

      if(len > 0) { 
       NSMutableData* datas=[[NSMutableData alloc] initWithLength:0]; 

       [datas appendBytes: (const void *)buf length:len]; 

       NSString *s = [[NSString alloc] initWithData:datas encoding:NSASCIIStringEncoding]; 

       [self readIn:s]; 
       NSLog(@"ss%@",s); 
       [self loadMovie:s]; //method for movie player 
      } 

我試圖顯示這是如下一個movieplayer ..

-(void_loadMovie:(NSString*)moviePrefix 
    { 
    NSString *path = [NSString stringWithFormat:@"%@.mjpg", moviePrefix]; 

    NSURL *url = [NSURL fileURLWithPath:path]; 
    if (url) { 
     _moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 

     _moviePlayer.view.frame = CGRectMake(0, 70, 600, 450); 
     _moviePlayer.controlStyle = MPMovieControlStyleNone; 
     _moviePlayer.scalingMode = MPMovieScalingModeNone; 
     [dic setObject:__moviePlayer forKey:path]; 
    } 

} 
[_moviePlayer prepareToPlay]; 
[self.view addSubview: _moviePlayer.view]; 
[self.view bringSubviewToFront:_moviePlayer.view]; 
[self.view addSubview: _moviePlayer.view]; 
[_moviePlayer play]; 
} 

是的NSString *路徑= [NSString的stringWithFormat:@」 %@。mjpg「,moviePrefix];正確的方法??

這顯示一個黑屏。怎麼了? 如果這種方式不正確,有沒有其他辦法我可以顯示這些幀? 誰能幫我解決這個...

+0

'的NSString *路徑= [的NSString stringWithFormat:stringWithFormat:@,moviePrefix,@ 「電影」, 「MJPEG。」];'爲什麼您使用'stringWithFormat:'兩次 –

+0

@OmerWaqasKhan對不起,這是一個錯字錯誤。 – Prarthana

回答

0

您不添加moviePrefix字符串

NSString *path = [NSString stringWithFormat:@".mjpg", moviePrefix, @"movie"]; 

將其更改爲

NSString *path = [NSString stringWithFormat:@"%@.mjpg", moviePrefix, @"movie"]; 
+1

你沒有收到與此相關的任何警告嗎? –

+0

最後的'@「電影」'還沒有被使用。也許'@「%@%@。mjpg」'? –

+0

這是什麼'@「電影」'?這裏的目的是什麼?對不起,我無法理解。 –

0

MJPEG只有JPEG發送一前一後。 我幾年前就此工作過。 在iOS版本(iOS5?)上,它很容易被UIWebView讀取,但iOS的更新打破了所有這一切。這打破了我目前的所有工作。 也許一個UIWebView可以今天再次(修復)。

無論如何,因爲它只是一堆JPEG,您可以只讀JPG(檢測JPG文件的開始/結束),創建JPG圖像並在UIImageView中顯示它。

一個解決(未測試),但你應該得到的整體思路:

//屬性

@property (nonatomic, strong) NSMutableData *data; 
@property (nonatomic, weak) IBOutlet UIImageView *streamImageView; 

//初始化某處

_data = [[NSMutableData alloc] init]; 

//在流委託方法:

//Start JPG: FFD8 — End JPG: FFD9 
UInt8 startJPEGBytes[2]; 
startJPEGBytes[0] = 0xFF; 
startJPEGBytes[1] = 0xD8; 
NSData *startData = [NSData dataWithBytes:&startJPEGBytes length:2]; 

UInt8 endJPEGBytes[2]; 
endJPEGBytes[0] = 0xFF; 
endJPEGBytes[0] = 0xD9; 
NSData *endData = [NSData dataWithBytes:&endJPEGBytes length:2]; 

[_data appendBytes: (const void *)buf length:len]; 
NSRange startRange = [_data rangeOfData:startData options:0 range:NSMakeRange(0, [_data length])]; 
if (startRange.location != NSNotFound) //We found the start of a JPEG 
{ 
    NSRange endRange = [_data rangeOfData:endData options:0 range:NSMakeRange(startRange.location, [_data length]-startRange.location)]; 
    if (endRange.location != NSNotFound) //We found the end of a JPEG 
    { 
     NSRange imageRange = NSMakeRange(startRange.location, endRange.location+endRange.length-startRange.location); 
     NSData *imageData = [_data subDataWithRange: imageRange]; 
     streamImage = [UIImage imageWithData:imageData]; 
     [_streamImageView setImage:streamImage]; 
     [_data replaceBytesInRange:NSMakeRange(0, imageRange.location+imageRange.length withBytes:NULL length:0]; //We remove the start till the end of JPEG frame. Start at 0, since there could be garbage at the start. 
    } 

} 
相關問題