GPUImage3无法将视频导出到文档目录

时间:2019-07-30 13:12:32

标签: ios swift gpu gpuimage

我正在使用以下源代码将经过过滤的视频导出到文档目录,但是导出的文件已损坏/错误。

请问以下消息来源,让我知道我在哪里犯错?

class ViewController: UIViewController {

    @IBOutlet weak var renderView: RenderView!

    var movie:MovieInput!
    var writer:MovieOutput!
    var filter:LookupFilter!

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        let bundleURL = Bundle.main.resourceURL!
        let movieURL = URL(string:"sample_iPod.m4v", relativeTo:bundleURL)!

        do {
            let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:true)
            let fileURL = documentDirectory.appendingPathComponent("TestVideo.mov")

            movie = try MovieInput(url:movieURL, playAtActualSpeed:true)
            writer = try MovieOutput(URL: fileURL, size: Size(width: 100.0, height: 100.0))

            filter = LookupFilter()
            filter.lookupImage = PictureInput(image: UIImage(named: "Image")!)
            movie --> filter --> renderView
            movie.runBenchmark = true

            movie.addTarget(writer)
            movie.start()
            writer.startRecording()

            self.writer.finishRecording {
                print("Written")
            }

        } catch {
            print("Couldn't process movie with error: \(error)")
        }
    }
}

1 个答案:

答案 0 :(得分:1)

简单的答案:现在您有5秒钟了。

     self.movie.addTarget(writer)
     self.movie.start()
     self.filter --> self.writer
    self.writer.startRecording()
    let interval = 5 // now you have 5 seconds .
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + interval) {
         self.writer.finishRecording {
             print("Written")
         }
 }

为解决您的问题, 您应该提取记录逻辑。将其放入过滤器按钮操作中。

类似于以下演示代码。

@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)
                let 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)
                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.movieOutput = nil
            }
        }
    }

您错过了一个行代码filter --> writer

movie.addTarget(writer)
movie.start()
filter --> writer
writer.startRecording()

self.writer.finishRecording {
     print("Written")
}