2016-11-02 8 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

関連する問題