2017-02-16 138 views
0

我无法将过滤后的视频保存到使用GPUImage 2的磁盘。我已经成功添加了一个过滤器,现在我需要将该视频保存到磁盘,这是我遇到问题的位置。有关于这方面与GPUImage 1个答案,但我不能让他们与GPUImage 2保存过滤后的电影GPUImage 2

工作的过滤:

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

do { 

        movie = try MovieInput(url: movieURL!, playAtActualSpeed: true) 
        filter = HueAdjustment() 
        filter.hue = hue 
        movie --> filter --> renderView 
        movie.runBenchmark = true 
        movie.start() 


       } catch { 

        print("Couldn't process movie error: \(error)") 

       } 

试图在此基础上是不是就sampleLiveRecording进行保存似乎适合过滤的电影。

{ 

     do { 

      let documentsDir = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) 

      let fileURL = URL(string: "testRender.mov", relativeTo: documentsDir)! 

      do { 

       try FileManager.default.removeItem(at: fileURL) 

      } catch {} 

      movieOutput = try MovieOutput(URL: fileURL, size: Size(width: 448, height: 426), liveVideo: false) 

      filter --> movieOutput! 
      movieOutput!.startRecording() 



     } catch { 

      fatalError("Couldn't Initialize Movie: \(error)") 

     } 



    } 

更新:我没有找到一个答案,但我恢复到使用GPUImage 1

回答

0

在我的实践我已经使用这个类的视频输出到文件中。

private class FileOutput { 

enum State: Int { 
    case created 
    case recording 
    case finishing 
} 

var state: State = .created 
let writingQueue = DispatchQueue(label: "FileOutputQueue", attributes: []) 
var fileURI: URL 
var duration: Double { 
    return fileOutput.recordDuration 
} 
var didFinishWriting: (() ->())? = nil 
fileprivate let fileOutput: MovieOutput 

init(camera: Camera, fileURI: URL) throws { 
    do { 
     self.fileURI = fileURI 
     fileOutput = try MovieOutput(URL: fileURI, 
            size: Size(width: 1080, height: 1920), 
            liveVideo: true) 
     let movieOutputFilter = BasicOperation() 
     movieOutputFilter.overriddenOutputRotation = .rotate180 
     camera --> movieOutputFilter --> fileOutput 
    } catch { 
     throw NSError(domain: "com.test.camera", code: 1200000, userInfo: nil) 
    } 
} 

func start() { 
    if state == .created { 
     state = .recording 
     let _ = writingQueue.sync { 
      self.fileOutput.startRecording() 
     } 
    } 
} 

func finish() { 
    if state == .recording { 
     state = .finishing 
     let _ = writingQueue.sync { 
      self.fileOutput.finishRecording { 
       [weak self] in 
       self?.didFinishWriting?() 
       self?.didFinishWriting = nil 
      } 
     } 
    } 
} 

deinit { 
    didFinishWriting = nil 
    print("FileOutput deinited") 
} 

}