2016-12-19 3 views
3

iOS에서 동영상 플레이어 프로젝트를 진행하고 있습니다.사용할 YCbCr 매트릭스는 무엇입니까? BT.709 또는 BT.601

AVFoundation을 사용하여 비디오 파일에서 CVPixelBuffer을 추출한 다음 해당 버퍼를 텍스처로 OpenGL에 보냅니다.

개념 증명 코드는 Apple's sample code에서 영감을 얻었습니다. AVFoundation은 YCbCr 색 공간의 각 프레임을 제공하며 OpenGL에서 렌더링하려면 RGB로 변환해야합니다. 이 변환은 다른 YCbCr 표준 (예 : ITU-R BT.709, ITU-R BT.601)에 따라 여러 개의 변환 행렬 옵션을 갖는 것으로 보입니다. 샘플 코드는 코드에 따라 사용할 한 결정

그러나
CFTypeRef colorAttachments = CVBufferGetAttachment(pixelBuffer, kCVImageBufferYCbCrMatrixKey, NULL); 
if (colorAttachments == kCVImageBufferYCbCrMatrix_ITU_R_601_4) { 
    _preferredConversion = kColorConversion601; 
} 
else { 
    _preferredConversion = kColorConversion709; 
} 

, 나는 신속한 사용하고 있는데 상수 kCVImageBufferYCbCrMatrix_ITU_R_601_4 유형 CFString 그래서 그들은 수의 동안 반환 colorAttachment 유형 Unmanaged<CFTypeRef>이다 직접적으로 동일시하지 마라. 제가 조사를 좀 해봤으로 돌아가 셨습니다 :

CFEqual(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4) // returns false 
CFEqual(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_709_2) // returns false too!! 
//----------------------------------------- 
CFGetType(colorAttachments) // returns 1 
CFStringGetType() // returns 7, note kCVImageBufferYCbCrMatrix_ITU_R_601_4 is of type CFString 
// so I still can't check their equality 
// because the retrieved colorAttachments is not of type CFString at all 

내가 매트릭스 및 결과 (렌더링 된 장면) 하드 코딩하여 두 변환 하나씩 시도 때문에 예측 인간의 눈으로 차이를 보인다 2 개의 변환 행렬은 그다지 다르지 않다.

내 질문 :

  1. 어떻게 사용하는 변환을 결정하기 위해?
  2. [1.]을 (를) 해결할 수없는 경우 둘 중 하나를 하드 코딩 할 수 있습니까? 그렇게하는 결과는 무엇입니까?
+0

사용할 디코딩 매트릭스 알기 위해, 당신은 당신의 비디오를 인코딩하는 데 사용 된 하나 알고 있어야합니다, 여기에 실제 안전한 가정은 없지만 BT.601은 SDTV를 단계적으로 폐기하기 때문에 BT.709가 내가 선택한 것입니다. –

+0

@KelSolaar, AVFoundation에서 인코딩하는 데 사용 된 행렬을 어떻게 쿼리해야합니까? –

+0

솔직히 말해서 나는 단서가 없다. AVFoundation에 대한 지식이 없지만, 디코딩 매트릭스로 BT.709를 사용한다는 가정에 대한 후속 조치로, 여기에 Youtube 인코딩 colourspaces 통계를 보여주는 이미지가있다 : https : // lh5 .googleusercontent.com/fOjQ4atwcb0uAuesxoN33X_eugAweHbR69Nk03_g3WlVhScqIzbCm5A1qQVLZlnFWojti5tGRUuMP41ysbcKgOMCgWJMq1jIQ82RHPOGJTCQSK8A9N03wpYDX-kiJ-SDCGy0HpJ8. BT.709는 요즘 유튜브에서 가장 많이 사용되는 색 공간으로, 대부분의 사람들이 자신의 비디오를 인코딩하고 있음을 의미합니다. –

답변

0

takeUnretainedValue()을 사용하면 CFTypeRef이됩니다. 그런 다음 downcast ~ CFString이어야합니다. 예를 들어, 코드는 다음과 같이 수 :

if let colorAttachment = CVBufferGetAttachment(image, kCVImageBufferYCbCrMatrixKey, nil)?.takeUnretainedValue(), 
    CFGetTypeID(colorAttachment) == CFStringGetTypeID() { 
    let colorAttachmentString = colorAttachment as! CFString 
    print(colorAttachmentString) 
    print(colorAttachmentString == kCVImageBufferYCbCrMatrix_ITU_R_601_4) 
    print(colorAttachmentString == kCVImageBufferYCbCrMatrix_ITU_R_709_2) 
} 

인쇄 어느 :

ITU_R_601_4 
true 
false