No se reproduce audio después de save el video con AVCaptureMovieFileOutput

Intento save un file de video de la camera del iPhone con el siguiente código:

class Camera { ... private func loadDeviceInput() { let devices = AVCaptureDevice.devices() as! [AVCaptureDevice] for device in devices { if device.hasMediaType(AVMediaTypeVideo) { if device.position == .Back { _deviceBack = device _inputBack = try? AVCaptureDeviceInput(device: device) } else if device.position == .Front { _deviceFront = device _inputFront = try? AVCaptureDeviceInput(device: device) } } else if device.hasMediaType(AVMediaTypeAudio) { _inputAudio = try? AVCaptureDeviceInput(device: device) } } } private func loadDeviceOutput() { _outputStill = AVCaptureStillImageOutput() _outputStill?.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] if _session.canAddOutput(_outputStill) { _session.addOutput(_outputStill) } _outputAudio = AVCaptureAudioDataOutput() if _session.canAddOutput(_outputAudio) { _session.addOutput(_outputAudio) } _outputVideo = AVCaptureMovieFileOutput() _outputVideo?.movieFragmentInterval = CMTimeMake(1, 1) // Save file header every second if _session.canAddOutput(_outputVideo) { _session.addOutput(_outputVideo) } } func startVideoCapture(writeTo file: NSURL, startedBlock: JrmgxNSURLResultBlock, stopedBlock: JrmgxNSURLResultBlock) { isSessionRunning() prepareForVideoCapture() _startVideoCaptureBlock = startedBlock _stopVideoCaptureBlock = stopedBlock if _outputVideo?.connectionWithMediaType(AVMediaTypeVideo)?.active ?? false == true { _outputVideo?.startRecordingToOutputFileURL(file, recordingDelegate: self) } else { // ERROR } } ... } 

y hasta ahora esto funciona, pero cuando reproduzco el video con AVPlayer no se reproduce ningún sonido. Si bash el video con Quiktime, el mismo problema, no hay sonido. PERO cuando lo abro con VLC, el sonido se reproduce.

Como reference, así es como toco el video, que funciona pero sin sonido:

 player = AVPlayer(URL: v) player.actionAtItemEnd = .None player.muted = false player.volume = 1 player.play() 

Inspeccioné el video con ffprone :

 $ ffprobe test4.mp4 ffprobe version 2.8.1 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test4.mp4': Metadata: major_brand : qt minor_version : 0 compatible_brands: qt creation_time : 2016-01-21 13:13:55 Duration: 00:00:06.37, start: 0.000000, bitrate: 818 kb/s Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt709/bt709), 480x360, 741 kb/s, 30.01 fps, 30 tbr, 600 tbn, 1200 tbc (default) Metadata: rotate : 90 creation_time : 2016-01-21 13:13:55 handler_name : Core Media Video Side data: displaymatrix: rotation of -90.00 degrees Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 62 kb/s (default) Metadata: creation_time : 2016-01-21 13:13:55 handler_name : Core Media Audio 

No tengo idea de lo que está mal, ¿podrías ayudarme?

Gracias

Los files mp4 y mov son muy similares pero tienen diferencias sutiles. Creo que VLC simplemente se da count de que el file es en realidad un .mov y luego lo reproduce en consecuencia, pero AVPlayer no lo está parsing.

está utilizando AVCaptureMovieFileOutput para save el video y sus estados de documentation:

AVCaptureMovieFileOutput es una subclass concreta de AVCaptureFileOutput que utiliza para capturar datos en una película QuickTime.

un poco de investigación sobre qué es una película de QuickTime revela que su extensión de file estándar es .mov:

Guardar como película QuickTime: esta opción saveá el video embedded en un formatting de file * .mov sin importar el contenedor original.

si guarda el file como .mov ya no debería haber problemas.