2017-02-16 4 views
0

Ich habe Probleme beim Speichern des gefilterten Videos auf der Festplatte mit GPUImage 2. Ich habe einen Filter erfolgreich hinzugefügt und jetzt muss ich dieses Video auf Festplatte speichern, wo ich auf Probleme stoße . Es gibt mehr Antworten zu diesem Thema mit GPUImage 1, aber ich bin sie nicht in der Lage zu bekommen mit GPUImage 2Gefilterten Film speichern GPUImage 2

die Filterung zu arbeiten:

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

       } 

Der Versuch, sie speichern auf der Grundlage der sampleLiveRecording, die nicht tut scheinen einem gefilterten Film zu passen.

{ 

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

     } 



    } 

Update: ich keine Antwort gefunden, aber ich kehrte GPUImage 1.

Antwort

0

In meiner Praxis zu verwenden habe ich diese Klasse für Video-Ausgang verwendet Datei.

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

}

Verwandte Themen