AVAssetWriterInput – pantalla en negro, 46 ​​horas de duración

Estoy intentando tomar una AVCaptureSession y codificar en mp4. Parece que esto debería ser sencillo, y estoy tratando de codificar un único flujo de video de 960×540; No me preocupa el audio a los efectos de este problema.

Cuando ejecuto el siguiente código y out2.mp4 del contenedor de documentos con Xcode, obtengo una pantalla negra en time rápido y la duración es de 46 horas. Al less la resolución se ve bien. Aquí está el resultado de ffmpeg -i out2.mp4

 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out2.mp4': Metadata: major_brand : mp42 minor_version : 1 compatible_brands: mp41mp42isom creation_time : 2015-11-18 01:25:55 Duration: 46:43:04.21, start: 168178.671667, bitrate: 0 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt709/bt709), 960x540, 1860 kb/s, 27.65 fps, 29.97 tbr, 600 tbn, 1200 tbc (default) Metadata: creation_time : 2015-11-18 01:25:55 handler_name : Core Media Video 

¿Por qué no puedo anexar búferes de muestra a AVAssetWriterInput en este escenario?

 var videoInput: AVAssetWriterInput? var assetWriter: AVAssetWriter? override func viewDidLoad() { super.viewDidLoad() self.startStream() NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: "swapSegment", userInfo: nil, repeats: false) } func swapSegment() { assetWriter?.finishWritingWithCompletionHandler(){ print("File written") } videoInput = nil } func pathForOutput() -> String { let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) if let documentDirectory: NSURL = urls.first { let fileUrl = documentDirectory.URLByAppendingPathComponent("out1.mp4") return fileUrl.path! } return "" } func startStream() { assetWriter = try! AVAssetWriter(URL: NSURL(fileURLWithPath: self.pathForOutput()), fileType: AVFileTypeMPEG4) let videoSettings: [String: AnyObject] = [AVVideoCodecKey: AVVideoCodecH264, AVVideoWidthKey: 960, AVVideoHeightKey: 540] videoInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoSettings) videoInput!.expectsMediaDataInRealTime = true assetWriter?.addInput(videoInput!) assetWriter!.startWriting() assetWriter!.startSessionAtSourceTime(kCMTimeZero) let videoHelper = VideoHelper() videoHelper.delegate = self videoHelper.startSession() } func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBufferRef, fromConnection connection: AVCaptureConnection!) { if let videoOutput = captureOutput as? AVCaptureVideoDataOutput { videoInput?.appendSampleBuffer(sampleBuffer) } } 

Tal vez sus times de presentación no sean relativos a su sourceTime ( kCMTimeZero ). Puede usar la primera timestamp de presentación de búfer como el time de origen.

ps tal vez 46 horas es aproximadamente el time de actividad de su dispositivo