2017-03-26 7 views
1

Je tente de convertir une trame 4: 3 en image 16: 9 dans le pipeline de capture vidéo. Et le cadre converti aurait besoin d'un traitement supplémentaire. Par conséquent, je dois garder le cadre couvert comme CVImageBufferRef. Je regardais ce fil de débordement de la pile, et emprunte une idée de ce iOS - Scale and crop CMSampleBufferRef/CVImageBufferRefConvertir un échantillon CVPixelBufferRef de 4: 3 à 16: 9

voici ce que je faisais:

int cropX0 = 0, cropY0 = 60, cropHeight = 360, cropWidth = 640, outWidth = 640, outHeight = 360; 
//get CVPixel buffer from CMSampleBuffer 
CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(cmSampleBuffer); 
CVPixelBufferLockBaseAddress(imageBuffer,0); 
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); 
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 

size_t startpos = cropY0 * bytesPerRow; 
void* cropStartAddr = ((char*)baseAddress) + startpos; 

CVPixelBufferRef cropPixelBuffer = NULL; 
int status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault, 
              outWidth, 
              outHeight, 
              CVPixelBufferGetPixelFormatType(imageBuffer), 
              cropStartAddr, 
              bytesPerRow, 
              NULL, 
              0, 
              NULL, 
              &cropPixelBuffer); 
if(status == 0){ 
    OSStatus result = 0; 
} 

Mais après cette méthode. si nous inspectons le cropPixelBuffer de Xcode. ça ressemble à une image corrompue.

enter image description here L'image originale ressemble à ceci

enter image description here

Je pense que ce pourrait être en raison du format de couleur est NV12 yuv format pixel Merci pour votre aide

Répondre

1

Si vos données d'image est yuv, alors vous pourriez faire face à plusieurs données planes (par exemple, plusieurs rowbytes, plusieurs baseAddrs et plusieurs , height s et plusieurs cultures) dans quel cas vous devrez utiliser

CVPixelBufferCreateWithPlanarBytes() 

alors qu'est-ce que CVPixelBufferGetPixelFormatType(imageBuffer) retourner?

+0

le format est kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange. Je pense que je dois distribuer les UV séparément – user454083

+0

Oui, cela signifie que vous avez deux cartes de bits à recadrer –