【问题标题】:AVPlayerLayer get Image to UIImageView BufferAVPlayerLayer 获取图像到 UIImageView 缓冲区
【发布时间】:2012-12-10 14:51:14
【问题描述】:

我尝试 [playerLayer renderInContext:UIGraphicsGetCurrentContext()];它将显示黑色背景。所以我得到当前的播放器项目作为连续的重击图像它看起来不像视频播放只是静止图像连续流动。所以还有其他选择吗?

【问题讨论】:

    标签: objective-c ios screenshot avplayerlayer


    【解决方案1】:

    试试这个代码设置阅读器

    //setUp Reader
        AVURLAsset * asset = [AVURLAsset URLAssetWithURL:urlvalue options:nil]; 
        [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ dispatch_async(dispatch_get_main_queue(), ^{
            AVAssetTrack * videoTrack = nil; 
            NSArray * tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
            if ([tracks count] == 1) {
                videoTrack = [tracks objectAtIndex:0];
                NSError * error = nil; 
                _movieReader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; 
                if (error) 
                    NSLog(error.localizedDescription); 
                NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; 
                NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_4444AYpCbCr16]; NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];
                [_movieReader addOutput:[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:videoTrack outputSettings:videoSettings]]; 
                 [_movieReader startReading];
    
            } 
        }); 
        }];
    

    获取下一帧

    - (void) readNextMovieFrame { 
    
        if (_movieReader.status == AVAssetReaderStatusReading) { 
    
            AVAssetReaderTrackOutput * output = [_movieReader.outputs objectAtIndex:0]; 
            CMSampleBufferRef sampleBuffer = [output copyNextSampleBuffer];
            if (sampleBuffer) {
                CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
                // Lock the image buffer 
                CVPixelBufferLockBaseAddress(imageBuffer,0);
                // Get information of the image 
                uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); 
                size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
                size_t width = CVPixelBufferGetWidth(imageBuffer); 
                size_t height = CVPixelBufferGetHeight(imageBuffer); 
    
                /*We unlock the  image buffer*/
                CVPixelBufferUnlockBaseAddress(imageBuffer,0);
    
                /*Create a CGImageRef from the CVImageBufferRef*/
                 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
                CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
                CGImageRef newImage = CGBitmapContextCreateImage(newContext); 
    
                /*We release some components*/
                CGContextRelease(newContext); 
                CGColorSpaceRelease(colorSpace);
    
                /*We display the result on the custom layer*/
                /*self.customLayer.contents = (id) newImage;*/
    
                /*We display the result on the image view (We need to change the orientation of the image so that the video is displayed correctly)*/
                UIImage *image= [UIImage imageWithCGImage:newImage scale:0.0 orientation:UIImageOrientationRight];
                UIGraphicsBeginImageContext(image.size);
    
                [image drawAtPoint:CGPointMake(0, 0)];
    
               // UIImage *img=UIGraphicsGetImageFromCurrentImageContext();
                videoImage=UIGraphicsGetImageFromCurrentImageContext();
    
                UIGraphicsEndImageContext();
    
    
    //videoImage=image;
    
              //  if (frameCount < 40) {
                    NSLog(@"readNextMovieFrame==%d",frameCount);
                          NSString* filename = [NSString stringWithFormat:@"Documents/frame_%d.png", frameCount];
                          NSString* pngPath = [NSHomeDirectory() stringByAppendingPathComponent:filename];
                         [UIImagePNGRepresentation(videoImage) writeToFile: pngPath atomically: YES];
                         frameCount++;
            //        }
    
                CVPixelBufferUnlockBaseAddress(imageBuffer,0); 
                CFRelease(sampleBuffer); 
            } 
        } 
    }
    
    猜你喜欢
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2012-01-27
    • 2014-10-26
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多