2016-11-02 1 views
0

Je n'arrive pas à le faire fonctionner. En conséquence, j'ai toujours un film vide. Si je remplace GPUImageAlphaBlendFilter avec quelque chose comme GPUImagePixellateFilter, la vidéo est rendue très bien.Impossible de faire en sorte que l'image statique de recouvrement GPUImageAlphaBlendFilter soit superposée au fichier vidéo

func convertVideo(source: URL, destination: URL, encodingPreferenses: VideoEncodingParams = .profileMedium, 
        overlayImage: UIImage?, completion: @escaping ExportAsyncBlock = { _, _ in }) { 

    let movieFile = GPUImageMovie(url: source) 
    movieFile?.runBenchmark = true 

    let alphaFilter = GPUImageAlphaBlendFilter() 
    alphaFilter.mix = 1.0 

    let markerInput = GPUImagePicture(image: ImageUtils.sharedUtils.resizeImage(overlayImage!, newSize: encodingPreferenses.videoSize, scaleFactor: 1.0)) 

    movieFile?.addTarget(alphaFilter) 
    markerInput?.addTarget(alphaFilter) 

    let movieWriter = GPUImageMovieWriter(movieURL: destination, size: encodingPreferenses.videoSize) 
    alphaFilter.addTarget(movieWriter) 

    movieWriter?.shouldPassthroughAudio = true 
    movieFile?.audioEncodingTarget = movieWriter 

    movieFile?.enableSynchronizedEncoding(using: movieWriter) 

    movieWriter?.startRecording() 
    movieFile?.startProcessing() 

    movieWriter?.completionBlock = { 
     print("Ahoy") 
     movieFile?.removeAllTargets() 
     movieWriter?.finishRecording { 
      print("Ahoy") 
     } 
    } 

} 

Répondre

1

Le processus de lecture/enregistrement de film est asynchrone. Par conséquent, il ne sera pas terminé au moment où votre méthode ci-dessus se termine.

Votre instance markerInput GPUImagePicture est allouée dans cette méthode et aucune référence forte ne lui est fournie en dehors de cette méthode. par conséquent, l'ARC libérera cette image en quittant cette méthode et supprimera sa contribution dans la chaîne de traitement. Votre enregistrement de film en cours après que cette méthode est terminée sera brouillé.

Une solution simple consiste à créer une variable d'instance pour markerInput dans la classe qui possède cette méthode, afin qu'elle vive au-delà de la méthode elle-même.

+0

Brad, merci beaucoup. J'ai re-architecturé ma fonction, maintenant ça fonctionne comme prévu. – sysx1000