web-dev-qa-db-fra.com

Comment appliquer des "filtres" à AvcaptureVidePreviewlayer

Mon application utilise actuellement l'AVFoundation pour prendre les données de la caméra brutes de la caméra arrière d'un iPhone et l'afficher sur une avCaptureVideoPreviewlayer en temps réel.

Mon objectif est de appliquer conditionnellement des filtres d'image simples à la couche de prévisualisation. Les images ne sont pas enregistrées, donc je n'ai pas besoin de capturer la sortie. Par exemple, je souhaite basculer un paramètre qui convertit la vidéo entrant sur la couche de prévisualisation en noir et blanc.

J'ai trouvé une question ici qui semble accomplir quelque chose de similaire en capturant les cadres vidéo individuels dans un tampon, appliquant les transformations souhaitées, puis affichant chaque image en tant qu'ostimage. Pour plusieurs raisons, cela semble être trop exclu pour mon projet et j'aimerais éviter les problèmes de performance que cela pourrait causer.

Est-ce le seul moyen d'accomplir mon objectif?

Comme je l'ai mentionné, je ne cherche pas à capturer l'une des vidéos d'AvcapturesSession, simplement la prévisualiser.

30
eschurter

Probablement le moyen le plus performant de manipuler ce serait d'utiliser OpenGL ES pour filtrage et affichage de ces cadres vidéo. Vous ne pourrez pas faire beaucoup de choses avec une avCaptureVideoPreviewlayer directement, en plus de régler son opacité lorsqu'il est superposé avec une autre vue ou une autre couche.

J'ai une demande d'échantillon ici où je saisie des cadres de la caméra et appliquez OpenGL ES 2.0 Shader pour traiter la vidéo en temps réel pour l'affichage. Dans cette application (expliqué en détail ici ), j'utilisais un filtrage à base de couleurs pour suivre les objets de la vue de la caméra, mais d'autres ont modifié ce code pour effectuer des effets de traitement vidéo soignés. Tous les filtres basés sur GPU dans cette application affichent à l'écran exécuté à 60 FPS sur mon iPhone 4.

Le seul périphérique iOS qui prend en charge la vidéo, mais il ne dispose pas d'un GPU capable OpenGL ES 2.0, est l'iPhone 3G. Si vous devez également cibler ce périphérique, vous pourrez peut-être prendre le code de base pour la capture vidéo et la génération de textures OpenGL ES, puis utilisez le code de filtrage à partir de l'application d'exemple d'Apple GlimageProcessing . Cette application est construite autour de OpenGL ES 1.1, support pour lequel est présent sur tous les appareils iOS.

Cependant, j'encourage vivement à regarder l'utilisation de OpenGL ES 2.0 pour cela, car vous pouvez retirer de nombreux types d'effets en utilisant des shaders que possible avec la fonction Fixe Fonction OpenGL ES 1.1.

(Edit: 2/13/2012) En tant que mise à jour sur ce qui précède, j'ai maintenant créé un cadre open source appelé GPuimage qui encapsule ce type de filtrage d'image personnalisé. Il gère également la capture de la vidéo et l'affichage à l'écran après avoir été filtré, nécessitant moins de six lignes de code pour définir tout cela. Pour plus d'informations sur le cadre, vous pouvez lire mon annonce plus détaillée .

66
Brad Larson

Je recommanderais de regarder l'exemple Rosy Writer Exemple de la bibliothèque de développement iOS. Brad Larson's bibliothèque GPuImage est assez génial mais il semble un peu excédent pour cette question.

Si vous êtes intéressé par l'ajout de Shaders OpenGL (AKA Filtres) à un AVCaptureVideoPreviewLayer Le flux de travail consiste à envoyer la sortie de la session de capture à une vue OpenGL pour le rendu.

AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
videoOut.videoSettings = @{ (id)kCVPixelBufferPixelFormatTypeKey : @(_renderer.inputPixelFormat) };
[videoOut setSampleBufferDelegate:self queue:_videoDataOutputQueue];

Puis dans le captureOutput: Délégué Envoyez le tampon d'échantillon à OpenGL Renderer

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    CVPixelBufferRef sourcePixelBuffer = CMSampleBufferGetImageBuffer( sampleBuffer );
    _renderer copyRenderedPixelBuffer:sourcePixelBuffer];
}

Dans OpenGL Renderer attacher le sourcePixelBuffer à une texture et vous pouvez le filtrer dans les shaders OpenGL. Le shader est un programme qui est exécuté sur une base de perpétuelle. L'exemple Rosy Writer montre également des exemples d'utilisation de différentes techniques de filtrage autres que OpenGL.

3
izzy

Exemple d'Apple AVCAMFilter Est-ce tout

enter image description here

0
Nick Kovalsky