Cómo grabar video y reproducir audio al mismo time (tutorial rápido)

¿Quiere grabar un video y reproducir música de la biblioteca del usuario al mismo time ? No busque más. A continuación se muestra la respuesta.

Para la reproducción de audio, usará AVAudioPlayer . Todo lo que tienes que hacer es declarar AVAudioPlayer como una variable global (lo llamé audioPlayer ) e implementar el código a continuación.

Use esto después de que el usuario haya elegido la canción que quiere jugar:

 func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) { let pickerItem: MPMediaItem = mediaItemCollection.items[0] let songURL = pickerItem.valueForProperty(MPMediaItemPropertyAssetURL) if let sURL = songURL as? NSURL { songTitle = pickerItem.title! do { audioPlayer = try AVAudioPlayer(contentsOfURL: sURL) } catch { print("Can't Create Audio Player: \(error)") } } dismissViewControllerAnimated(true, completion: { () -> Void in audioPlayer.play() }) } 

También necesitará configurar la session de audio (en viewDidLoad ). Es crucial si desea que el audio se reproduzca mientras se graba:

  // Audio Session Setup do { try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord) } catch { print("Can't Set Audio Session Category: \(error)") } AVAudioSessionCategoryOptions.MixWithOthers do { try audioSession.setMode(AVAudioSessionModeVideoRecording) } catch { print("Can't Set Audio Session Mode: \(error)") } // Start Session do { try audioSession.setActive(true) } catch { print("Can't Start Audio Session: \(error)") } 

Ahora para la grabación de video . AVCaptureSession . Declara lo siguiente como variables globales:

 let captureSession = AVCaptureSession() var currentDevice: AVCaptureDevice? var videoFileOutput: AVCaptureMovieFileOutput? var cameraPreviewLayer: AVCaptureVideoPreviewLayer? 

Luego configure la session en viewDidLoad . Nota: la vista previa del video está en un contenedor y todo el código relacionado con el video está en un controller de vista diferente, pero solo usar una vista en lugar de un contenedor debería funcionar igual de bien:

 // Preset For 720p captureSession.sessionPreset = AVCaptureSessionPreset1280x720 // Get Available Devices Capable Of Recording Video let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as! [AVCaptureDevice] // Get Back Camera for device in devices { if device.position == AVCaptureDevicePosition.Back { currentDevice = device } } let camera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) // Audio Input let audioInputDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio) do { let audioInput = try AVCaptureDeviceInput(device: audioInputDevice) // Add Audio Input if captureSession.canAddInput(audioInput) { captureSession.addInput(audioInput) } else { NSLog("Can't Add Audio Input") } } catch let error { NSLog("Error Getting Input Device: \(error)") } // Video Input let videoInput: AVCaptureDeviceInput do { videoInput = try AVCaptureDeviceInput(device: camera) // Add Video Input if captureSession.canAddInput(videoInput) { captureSession.addInput(videoInput) } else { NSLog("ERROR: Can't add video input") } } catch let error { NSLog("ERROR: Getting input device: \(error)") } // Video Output videoFileOutput = AVCaptureMovieFileOutput() captureSession.addOutput(videoFileOutput) // Show Camera Preview cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) view.layer.addSublayer(cameraPreviewLayer!) cameraPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill let width = view.bounds.width cameraPreviewLayer?.frame = CGRectMake(0, 0, width, width) // Bring Record Button To Front & Start Session view.bringSubviewToFront(recordButton) captureSession.startRunning() print(captureSession.inputs) 

Entonces creas una @IBAction para el manejo cuando el usuario presiona el button de grabación (solo usé un button simple que hice rojo y networkingondo):

 @IBAction func capture(sender: AnyObject) { do { initialOutputURL = try NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true).URLByAppendingPathComponent("output").URLByAppendingPathExtension("mov") } catch { print(error) } if !isRecording { isRecording = true UIView.animateWithDuration(0.5, delay: 0.0, options: [.Repeat, .Autoreverse, .AllowUserInteraction], animations: { () -> Void in self.recordButton.transform = CGAffineTransformMakeScale(0.75, 0.75) }, completion: nil) videoFileOutput?.startRecordingToOutputFileURL(initialOutputURL, recordingDelegate: self) } else { isRecording = false UIView.animateWithDuration(0.5, delay: 0, options: [], animations: { () -> Void in self.recordButton.transform = CGAffineTransformMakeScale(1.0, 1.0) }, completion: nil) recordButton.layer.removeAllAnimations() videoFileOutput?.stopRecording() } } 

Luego, todo lo que queda por hacer es save el video en (presumiblemente) el rollo de la camera. Pero no includeé eso. Debes esforzarte por vosotros mismos. (sugerencia: UISaveVideoAtPathToSavedPhotosAlbum )

Entonces eso es todo amigos. Así es como usa AVFoundation para grabar un video y reproducir música de la biblioteca al mismo time.