将传入的NSStream转换为视图
问题描述:
我正在成功发送一个NSData流。下面的委托方法获取该流并附加到NSMutableData self.data。我如何获取这些数据并将其制作成UIView/AVCaptureVideoPreviewLayer(应该显示视频)?我觉得我错过了另一个转换,AVCaptureSession> NSStream> MCSession> NSStream>?将传入的NSStream转换为视图
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
switch(eventCode) {
case NSStreamEventHasBytesAvailable:
{
if(!self.data) {
self.data = [NSMutableData data];
}
uint8_t buf[1024];
unsigned int len = 0;
len = [(NSInputStream *)stream read:buf maxLength:1024];
if(len) {
[self.data appendBytes:(const void *)buf length:len];
} else {
NSLog(@"no buffer!");
}
// Code here to take self.data and convert the NSData to UIView/Video
}
我这个送流:
-(void) captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
// size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
void *src_buff = CVPixelBufferGetBaseAddress(imageBuffer);
NSData *data = [NSData dataWithBytes:src_buff length:bytesPerRow * height];
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
NSError *error;
self.oStream = [self.mySession startStreamWithName:@"videoOut" toPeer:[[self.mySession connectedPeers]objectAtIndex:0] error:&error];
self.oStream.delegate = self;
[self.oStream scheduleInRunLoop:[NSRunLoop mainRunLoop]
forMode:NSDefaultRunLoopMode];
[self.oStream open];
[self.oStream write:[data bytes] maxLength:[data length]];
// CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CGSize imageSize = CVImageBufferGetEncodedSize(imageBuffer);
// also in the 'mediaSpecific' dict of the sampleBuffer
NSLog(@"frame captured at %.fx%.f", imageSize.width, imageSize.height);
}
答
您可以作出这样的YOUT处理事件的一个的UIImageView:
UIImageView * iv = [[UIImageView alloc] initWithImage: [UIImage imageWithData: self.data];
您也可以ALLOC只有一次,只是调用init。
每当你从套接字接收到,你初始化UIImageView,你可以显示它将UIImageView添加到UIView。
对不起,我的英语,我不知道如果我理解你
+0
这似乎不起作用。 – Eric
答
我想你需要AVCaptureManager
,看看下面的代码对你的作品..
AVCamCaptureManager *manager = [[AVCamCaptureManager alloc] init];
[self setCaptureManager:manager];
[[self captureManager] setDelegate:self];
if ([[self captureManager] setupSession]) {
// Create video preview layer and add it to the UI
AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[[self captureManager] session]];
UIView *view = self.videoPreviewView;//Add a view in XIB where you want to show video
CALayer *viewLayer = [view layer];
[viewLayer setMasksToBounds:YES];
CGRect bounds = [view bounds];
[newCaptureVideoPreviewLayer setFrame:bounds];
[newCaptureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[viewLayer insertSublayer:newCaptureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]];
[self setCaptureVideoPreviewLayer:newCaptureVideoPreviewLayer];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[[self captureManager] session] startRunning];
});
}
管理代表
- (void)captureManager:(AVCamCaptureManager *)captureManager didFailWithError:(NSError *)error
{
}
- (void)captureManagerRecordingBegan:(AVCamCaptureManager *)captureManager
{
}
- (void)captureManagerRecordingFinished:(AVCamCaptureManager *)captureManager outputURL:(NSURL *)url
{
}
- (void)captureManagerStillImageCaptured:(AVCamCaptureManager *)captureManager
{
}
- (void)captureManagerDeviceConfigurationChanged:(AVCamCaptureManager *)captureManager
{
}
我希望它有帮助。
您可能想看看您是否可以使用Open GL。把你的数据,转换成GL纹理,然后用GL来显示它。这可能是一个更高级别的API。数据不是以任何标准格式? – nielsbot
什么是视频格式?一个'UIView'?什么是视频的链接? – Larme
视频格式为AVCaptureSession – Eric