代码之家  ›  专栏  ›  技术社区  ›  PR Singh Ankit Vyas

VideoToolBox解码图像显示是Yosemite OSX中的flickring

  •  0
  • PR Singh Ankit Vyas  · 技术社区  · 8 年前

    我使用videoToolBox对数据进行编码和解码, 因此,一旦我们获得了直接解码的数据,我们将传递给 AVSampleBufferDisplayLayer

    下面是代码片段

     -(CVPixelBufferRef)decode:(AVPacket*)vp {
    
        CVPixelBufferRef outputPixelBuffer = NULL;
    
        CMBlockBufferRef blockBuffer = NULL;
        OSStatus status  = CMBlockBufferCreateWithMemoryBlock(kCFAllocatorDefault,
                                                              (void*)vp->data, vp->size,
                                                              kCFAllocatorNull,
                                                              NULL, 0, vp->size,
                                                              0, &blockBuffer);
    
    
        //NSLog(@"status is for CMBlockBufferCreateWithMemoryBlock is %d",(int)status);
        if(status == kCMBlockBufferNoErr) {
            CMSampleBufferRef sampleBuffer = NULL;
            const size_t sampleSizeArray[] = {vp->size};
            status = CMSampleBufferCreateReady(kCFAllocatorDefault,
                                               blockBuffer,
                                               formatDesc ,
                                               1, 0, NULL, 1, sampleSizeArray,
                                               &sampleBuffer);
           // NSLog(@"status is for formatdesc is %d",(int)status);
            if (status == kCMBlockBufferNoErr && sampleBuffer) {
                CFArrayRef attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, YES);
                CFMutableDictionaryRef dict = (CFMutableDictionaryRef)CFArrayGetValueAtIndex(attachments, 0);
                CFDictionarySetValue(dict, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanTrue);
                [displayLayer flush];
                if([displayLayer isReadyForMoreMediaData])
                {
                    [displayLayer enqueueSampleBuffer:sampleBuffer];
                }
    
                [displayLayer setNeedsDisplay];
    
                [self performSelectorOnMainThread:@selector(setView:) withObject:[[RPCViewerAppInitializer sharedRPCViewerAppInitializer] rpcView] waitUntilDone:NO];
                CFRelease(blockBuffer);
                CFRelease(sampleBuffer);
    
            }
        }
        return outputPixelBuffer;
    }
    

    上述代码在10.10 osx中运行良好,但在10.10中,我的屏幕上出现闪烁。

    1 回复  |  直到 8 年前
        1
  •  0
  •   PR Singh Ankit Vyas    8 年前

    这个问题已经解决了:

    我将AVSampleBufferDisplayLayer的controlTimebase属性设置为nil,这就是原因,现在我根本没有设置这个属性

    推荐文章