GPUImage3 MovieOutput выводит битые кадры - PullRequest
0 голосов
/ 26 февраля 2020

Я только что сохранил выходное видео в Фото. Я пересмотрел некоторые из них в примере SimpleVideoRecorder, или вы можете просто скопировать / вставить следующие коды:

import UIKit
import GPUImage
import AVFoundation
import Photos

class ViewController: UIViewController {
    @IBOutlet weak var renderView: RenderView!
    var camera:Camera!
    var filter:SaturationAdjustment!
    var isRecording = false
    var movieOutput:MovieOutput? = nil
    var fileURL: URL!

    override func viewDidLoad() {
        super.viewDidLoad()

        do {
            camera = try Camera(sessionPreset:.vga640x480)
            camera.runBenchmark = true
            filter = SaturationAdjustment()
            camera --> filter --> renderView
            camera.startCapture()
        } catch {
            fatalError("Could not initialize rendering pipeline: \(error)")
        }
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    }

    @IBAction func capture(_ sender: AnyObject) {
        if (!isRecording) {
            do {
                self.isRecording = true
                let documentsDir = try FileManager.default.url(for:.documentDirectory, in:.userDomainMask, appropriateFor:nil, create:true)
                fileURL = URL(string:"test.mp4", relativeTo:documentsDir)!
                do {
                    try FileManager.default.removeItem(at:fileURL)
                } catch {
                }

                movieOutput = try MovieOutput(URL:fileURL, size:Size(width:480, height:640), liveVideo:true)
//                camera.audioEncodingTarget = movieOutput
                filter --> movieOutput!
                movieOutput!.startRecording()
                DispatchQueue.main.async {
                    // Label not updating on the main thread, for some reason, so dispatching slightly after this
                    (sender as! UIButton).titleLabel!.text = "Stop"
                }
            } catch {
                fatalError("Couldn't initialize movie, error: \(error)")
            }
        } else {
            movieOutput?.finishRecording{
                self.isRecording = false
                DispatchQueue.main.async {
                    (sender as! UIButton).titleLabel!.text = "Record"
                }
//                self.camera.audioEncodingTarget = nil
                self.movieOutput = nil
                PHPhotoLibrary.shared().performChanges({() -> Void in
                    PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: self.fileURL)
                }, completionHandler: { _, error -> Void in
                    do {
                        // delete the caches.
                        try FileManager.default.removeItem(at: self.fileURL)
                    } catch {
                        print(error)
                    }
                })
            }
        }
    }
}

Тогда вы можете легко сказать, что почти каждый отдельный кадр поврежден. Это происходит на моем iPhone6S с iOS 13.3.1, а также в случае, когда я преобразую текстуру из фильтра в CVPixelBuffer.

Я думаю, что в BasicOperation может быть что-то не так. Я также публикую ту же проблему на GitHub БрэдЛарсона .

...