2016-11-02 1 views
0

제대로 작동하지 않습니다. 결과적으로 저는 alvays에는 빈 영화가 있습니다. GPUImageAlphaBlendFilter를 GPUImagePixellateFilter와 같은 것으로 바꾸면 비디오가 잘 렌더링됩니다.동영상 파일 위에 GPUImageAlphaBlendFilter 오버레이 정적 이미지를 만들 수 없습니다.

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") 
     } 
    } 

} 

답변

1

동영상 재생/기록 프로세스가 비동기 적으로 발생합니다. 따라서 위의 방법이 완료 될 때까지 완료되지 않습니다.

markerInput GPUImagePicture 인스턴스가 해당 메서드 내에서 할당되며 해당 메서드 외부에서 강력한 참조가 제공되지 않습니다. 따라서 ARC는이 방법을 종료 할 때이 그림의 할당을 취소하고 입력을 처리 체인에 전달합니다. 이 방법을 마친 후에 계속 진행되는 동영상은 왜곡됩니다.

쉬운 해결책은이 메서드를 소유 한 클래스에서 markerInput에 대한 인스턴스 변수를 만들어 메서드 자체를 넘어 살 수 있도록하는 것입니다.

+0

대단히 감사합니다. 내 기능을 다시 설계 했으므로 이제 예상대로 작동합니다. – sysx1000

관련 문제