2016-09-20 3 views
0

Ich habe eine Funktion zum Komprimieren einer Videodatei erstellt. Es verwendet AVAssetWriter und fügt Ein- und Ausgänge für Video- und Audiospuren hinzu. Wenn es zu schreiben beginnt, bekomme ich einen Fehler, wenn die AVAssetReader für die Audiospur beginnt zu lesen, audioReader.startReading(). Hier der Fehler *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetReader startReading] cannot be called again after reading has already started'.Videokomprimierung mit AVAssetWriter

Der Code: https://gist.github.com/jaumevn/9ba329aaf49c81c57a276fd135f53f20

Kann jemand sehen, was ist das Problem hier? Vielen Dank!

Antwort

0

Zeile 77 Ihres Codes, Sie starten einen zweiten AVAssetReader für die gleiche Datei.

Sie müssen nicht zwei Leser anschließen, stattdessen sollten Sie Ihren AVAudioAssetReader als Ausgang für den vorhandenen AVAssetReader anschließen.

Etwas wie folgt aus:

let videoReaderSettings : [String : Int] = [kCVPixelBufferPixelFormatTypeKey as String : Int(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)] 
    let videoReaderOutput = AVAssetReaderTrackOutput(track: videoAssetTrack, outputSettings: videoReaderSettings) 
    let videoReader = try! AVAssetReader(asset: videoAssetUrl) 

    var settings = [String : AnyObject]() 
    settings[AVFormatIDKey] = Int(kAudioFormatLinearPCM) 
    let audioReaderOutput = AVAssetReaderTrackOutput(track: audioAssetTrack, outputSettings: settings) 

    videoReader.addOutput(videoReaderOutput) 
    videoReader.addOutput(audioReaderOutput) 

    videoWriter.startWriting() 
    videoReader.startReading() 

Blick in die Verwendung AVCaptureVideoDataOutputSampleBufferDelegate und AVCaptureAudioDataOutputSampleBufferDelegate zu erfassen und die Puffer aus dem Leser zu verarbeiten.

Verwandte Themen