【问题标题】:GPUImage3 Unable to export video to Document DirectoryGPUImage3 无法将视频导出到文档目录
【发布时间】:2019-07-30 13:12:32
【问题描述】:

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

您能否通过以下来源告诉我我在哪里犯了错误?

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

【问题讨论】:

    标签: ios swift gpu gpuimage


    【解决方案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")
    }
    

    【讨论】:

    • 还是有问题。导出的文件为零字节,不播放过滤后的视频。
    • 因为你的代码逻辑只是记录下来,马上完成。
    • 希望我的回答对您有所帮助,并且您可以享受 GPU Image @Bhargav Soni 的乐趣
    • 我已经尝试过您的逻辑,但仍然存在问题。你在发布之前测试过代码吗?请理解要求。我不是在录制视频。视频已存在于项目中。我需要用过滤器导出它。我不明白为什么我们需要延迟程序。我正在研究以下源代码:github.com/BradLarson/GPUImage3/tree/master/examples/iOS/…
    • 很抱歉我有一个小错误。您开始录制的时间,必须与您完成录制的时间有一段距离(interval)。
    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2015-02-04
    • 2017-07-10
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多