Sound does not play after saving video using AVCaptureMovieFileOutput

I am trying to save a video file from an iphone camera using the following code:

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 } } ... } 

and while it works, but when I play the video using AVPlayer, the sound does not play. If I try a video with Quiktime, with the same problem, no sound. BUT, when I open it using VLC, the sound is reproduced.

For reference, this is how I play a video that works, but without sound:

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

I watched the video using 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 

I have no idea what is wrong, could you help me?

thanks

+6
source share
1 answer

mp4 and mov files are very similar, but have subtle differences. I think VLC just understands that the file is actually a .mov, and then plays it accordingly, but AVPlayer does not type it.

you use AVCaptureMovieFileOutput to save the video and its documentation:

AVCaptureMovieFileOutput is a specific subclass of the AVCaptureFileOutput class that you use to capture data in a QuickTime movie.

A bit of research on what a QuickTime movie shows is its standard file extension: .mov:

Save as QuickTime movie - this option saves the embedded video in * .mov format no matter what the original container was / was.

if you save the file as .mov, there should be no more problems.

+4
source

All Articles