iOS - Échelle et recadrer CMSampleBufferRef / CVImageBufferRef
Je suis en utilisant AVFoundation et obtenir le tampon d'échantillon de AVCaptureVideoDataOutput
je peux l'écrire directement à videoWriter en utilisant:
- (void)writeBufferFrame:(CMSampleBufferRef)sampleBuffer {
CMTime lastSampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
if(self.videoWriter.status != AVAssetWriterStatusWriting)
{
[self.videoWriter startWriting];
[self.videoWriter startSessionAtSourceTime:lastSampleTime];
}
[self.videoWriterInput appendSampleBuffer:sampleBuffer];
}
Ce que je veux faire maintenant est de recadrer et de redimensionner l'image à l'intérieur de la CMSampleBufferRef sans la convertir en UIImage ou CGImageRef parce que ça ralentit les performances.
source d'informationauteur vodkhang
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez vimage vous pouvez travailler directement sur le tampon de données sans avoir à les convertir à n'importe quel format d'image.
outImg contient les recadrée et redimensionnée les données de l'image. La relation entre outWidth et cropWidth définit la mise à l'échelle.
Paramètre cropX0 = 0 et cropY0 = 0 et cropWidth et cropHeight à la taille d'origine signifie pas de recadrage (à l'aide de l'ensemble de l'image d'origine). Réglage outWidth = cropWidth et outHeight = cropHeight résultats dans aucune mise à l'échelle. Notez que inBuff.rowBytes devrait toujours être la longueur de la source de la mémoire tampon, non pas de la longueur rognée.
Vous pouvez envisager d'utiliser CoreImage (5.0+).
Avis
J'ai récemment eu besoin d'écrire cette fonction, et a constaté que cette méthode ne semble pas fonctionner (au moins, je ne pouvais pas le faire fonctionner sur iOS 10.3.1). L'image de sortie n'aurais pas alignés. Je suppose que c'est à cause de la mauvaise
bytesPerRow
.Réponse Originale À Cette Question
La mémoire tampon est tout simplement un tableau de pixels, de sorte que vous pouvez réellement traiter le tampon directement, sans l'aide de vImage. Le Code est écrit en Swift, mais je pense qu'il est facile de trouver l'Objective-C équivalent.
Swift 3
Swift 2
Si vous voulez des cultures d'une certaine position, ajoutez le code suivant:
et modifier le
baseAddress
dansCGBitmapContextCreate
enstartAddress
. Assurez-vous de ne pas dépasser l'origine de l'image de largeur et de hauteur.Pour la mise à l'échelle vous pouvez avoir AVFoundation le faire pour vous. Voir mon post récent ici. Définition de la valeur de AVVideoWidth/AVVideoHeight clé de mise à l'échelle les images si elles ne sont pas les mêmes dimensions. Regardez les propriétés ici.Comme pour le recadrage, je ne suis pas sûr si vous pouvez avoir AVFoundation le faire pour vous. Vous pouvez avoir recours à l'utilisation d'OpenGL ou de CoreImage. Il ya un couple de bons liens en haut de post pour cette DONC, la question.
Essayez ceci sur Swift3