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.
L'image originale ressemble à ceci
Je pense que ce pourrait être en raison du format de couleur est NV12 yuv format pixel Merci pour votre aide
le format est kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange. Je pense que je dois distribuer les UV séparément – user454083
Oui, cela signifie que vous avez deux cartes de bits à recadrer –