小编did*_*ing的帖子

为什么AVSampleBufferDisplayLayer停止显示从AVCaptureVideoDataOutput的委托获取的CMSampleBuffers?

我想用AVSampleBufferDisplayLayer显示一些CMSampleBuffer,但是在显示第一个样本后冻结。

我从AVCaptureVideoDataOutputSampleBuffer委托获取了samplebuffers:

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    CFRetain(sampleBuffer);
    [self imageToBuffer:sampleBuffer];
    CFRelease(sampleBuffer);
}
Run Code Online (Sandbox Code Playgroud)

将它们放入向量

-(void) imageToBuffer: (CMSampleBufferRef )source{
//buffers is defined as: std::vector<CMSampleBufferRef> buffers;
        CMSampleBufferRef newRef;
        CMSampleBufferCreateCopy(kCFAllocatorDefault, source, &newRef);
        buffers.push_back(newRef);
}
Run Code Online (Sandbox Code Playgroud)

然后尝试通过AVSampleBufferDisplayLayer(在另一个ViewController中)显示它们

AVSampleBufferDisplayLayer * displayLayer = [[AVSampleBufferDisplayLayer alloc] init];

    displayLayer.bounds = self.view.bounds;
    displayLayer.position = CGPointMake(CGRectGetMidX(self.displayOnMe.bounds), CGRectGetMidY(self.displayOnMe.bounds));
    displayLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    displayLayer.backgroundColor = [[UIColor greenColor] CGColor];

    [self.view.layer addSublayer:displayLayer];
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    dispatch_queue_t queue = dispatch_queue_create("My queue", DISPATCH_QUEUE_SERIAL);
    [displayLayer setNeedsDisplay];
    [displayLayer requestMediaDataWhenReadyOnQueue:queue
                                        usingBlock:^{
                                            while ([displayLayer isReadyForMoreMediaData]) {

                                                if (samplesKey < buffers.size()) …
Run Code Online (Sandbox Code Playgroud)

objective-c ios cmsamplebufferref

5
推荐指数
1
解决办法
2445
查看次数

标签 统计

cmsamplebufferref ×1

ios ×1

objective-c ×1