2015-05-27 25 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. 
    } 

} 
相关问题