2013-03-09 2 views
6

AVPlayerItemVideoOutput에서 추출한 pixelBuffer를 CIImage로 변환하려하지만 항상 nil을 얻으려고합니다.CIImage에 CVPixelBuffer가 항상 nil을 반환합니다.

if([videoOutput_ hasNewPixelBufferForItemTime:player_.internalPlayer.currentItem.currentTime]) 
{ 
    CVPixelBufferRef pixelBuffer = [videoOutput_ copyPixelBufferForItemTime:player_.internalPlayer.currentItem.currentTime 
                 itemTimeForDisplay:nil]; 

    CIImage *image = [CIImage imageWithCVPixelBuffer:pixelBuffer]; // Always image === nil 
    CIFilter *filter = [FilterCollection filterSepiaForImage:image]; 
    image = filter.outputImage; 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgimg = [context createCGImage:image fromRect:[image extent]]; 
    [pipLayer_ setContents:(id)CFBridgingRelease(cgimg)]; 

} 

아래는 (항상 전무 결과)를 CIImage를 만들기 위해 사용되는 pixelBuffer의 세부 사항되는 코드 :

$0 = 0x09b48720 <CVPixelBuffer 0x9b48720 width=624 height=352 bytesPerRow=2496 pixelFormat=BGRA iosurface=0x0 attributes=<CFBasicHash 0x98241d0 [0x1d244d8]>{type = immutable dict, count = 3, 
entries => 
    0 : <CFString 0x174cf4 [0x1d244d8]>{contents = "Height"} = <CFNumber 0x9a16e70 [0x1d244d8]>{value = +352, type = kCFNumberSInt32Type} 
    1 : <CFString 0x174ce4 [0x1d244d8]>{contents = "Width"} = <CFNumber 0x9a109d0 [0x1d244d8]>{value = +624, type = kCFNumberSInt32Type} 
    2 : <CFString 0x1750e4 [0x1d244d8]>{contents = "PixelFormatType"} = <CFArray 0x1090ddd0 [0x1d244d8]>{type = mutable-small, count = 1, values = (
    0 : <CFNumber 0x7a28050 [0x1d244d8]>{value = +1111970369, type = kCFNumberSInt32Type} 
)} 
} 
propagatedAttachments=<CFBasicHash 0x9b485c0 [0x1d244d8]>{type = mutable dict, count = 6, 
entries => 
    0 : <CFString 0x174ff4 [0x1d244d8]>{contents = "CVImageBufferTransferFunction"} = <CFString 0x174f84 [0x1d244d8]>{contents = "ITU_R_709_2"} 
    2 : <CFString 0x174f74 [0x1d244d8]>{contents = "CVImageBufferYCbCrMatrix"} = <CFString 0x174f94 [0x1d244d8]>{contents = "ITU_R_601_4"} 
    9 : <CFString 0x174f14 [0x1d244d8]>{contents = "CVPixelAspectRatio"} = <CFBasicHash 0x9b1bc30 [0x1d244d8]>{type = immutable dict, count = 2, 
entries => 
    0 : <CFString 0x174f34 [0x1d244d8]>{contents = "VerticalSpacing"} = <CFNumber 0x9b0f730 [0x1d244d8]>{value = +1, type = kCFNumberSInt32Type} 
    2 : <CFString 0x174f24 [0x1d244d8]>{contents = "HorizontalSpacing"} = <CFNumber 0x9b0f730 [0x1d244d8]>{value = +1, type = kCFNumberSInt32Type} 
} 

    10 : <CFString 0x174fb4 [0x1d244d8]>{contents = "CVImageBufferColorPrimaries"} = <CFString 0x174fd4 [0x1d244d8]>{contents = "SMPTE_C"} 
    11 : <CFString 0x174e24 [0x1d244d8]>{contents = "QTMovieTime"} = <CFBasicHash 0x7a47940 [0x1d244d8]>{type = immutable dict, count = 2, 
entries => 
    0 : <CFString 0x174e44 [0x1d244d8]>{contents = "TimeScale"} = <CFNumber 0x7a443d0 [0x1d244d8]>{value = +90000, type = kCFNumberSInt32Type} 
    2 : <CFString 0x174e34 [0x1d244d8]>{contents = "TimeValue"} = <CFNumber 0x7a476e0 [0x1d244d8]>{value = +1047297, type = kCFNumberSInt64Type} 
} 

    12 : <CFString 0x174eb4 [0x1d244d8]>{contents = "CVFieldCount"} = <CFNumber 0x9b0f730 [0x1d244d8]>{value = +1, type = kCFNumberSInt32Type} 
} 
nonPropagatedAttachments=<CFBasicHash 0x9b44b40 [0x1d244d8]>{type = mutable dict, count = 0, 
entries => 
} 
> 

답변

10

작성 중에 다른 키와 함께이 사전을 통과 - 보인다 동안, 나는 시뮬레이터에 노력 하였다 이는 기기에서만 지원됩니다.

+0

OMG ... 어딘가에 문서화되어 있습니까? –

+0

"문제가 해결되었습니다." 스위프트에서 내 let inputImage = CIImage (CVPixelBuffer : pixelBuffer)는 항상 시뮬레이터와 장치의 객체에 nil을 반환합니다. : –

+0

기기에서 아무 것도 안 보입니다. 아무도 이유를 말해 줄 수 있습니까? –

2

당신이없는 것 같다 iosurface 속성 키가 정의되었습니다. 100 % 당신의 문제를 해결하지만,이 시도됩니다

CFDictionaryRef attrs = (CFDictionaryRef)@{ 
    (id)kCVPixelBufferWidthKey: @(WIDTH_OF_YOUR_VIDEO_GOES_HERE), 
    (id)kCVPixelBufferHeightKey: @(HEIGHT_OF_YOUR_VIDEO_GOES_HERE), 
    (id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange;), // kCVPixelFormatType_32BGRA 
    (id)kCVPixelBufferIOSurfacePropertiesKey: @{}, 
} 

을 그리고이 문제를 해결하여 pixelbuffer

+0

macos v10.10에서 kCVPixelBufferPixelFormatTypeKey = kCVPixelFormatType_32ARGB를 설정해야합니다. '+ [CIImage imageWithCVPixelBuffer :]'가 성공할 수 있습니다. – fengxing

0

이것은 레이어의 콘텐츠를 설정하는 방식이 아닙니다. 이것은 :

(__bridge id) uiImage.CGImage;

기기 나 시뮬레이터에서 작업 한 방법이 없습니다.