Antwort

6

Für die Audiowiedergabe verwenden Sie AVAudioPlayer. Alles, was Sie tun müssen, ist die AVAudioPlayer als globale Variable (ich nannte es audioPlayer) zu deklarieren und den folgenden Code zu implementieren.

verwenden in nachdem der Benutzer wählte den Song er/sie spielen will:

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() 
    }) 
} 

Sie werden auch auf müssen die Audiositzung (in viewDidLoad) eingerichtet. Es ist entscheidend, wenn Sie Audio-wollen, während der Aufnahme zu spielen:

// 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)") 
    } 

Jetzt für die Videoaufzeichnung. Sie werden AVCaptureSession verwenden. Deklarieren Sie die folgenden als globale Variablen:

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

Dann die Sitzung in viewDidLoad konfigurieren. Hinweis: Die Video-Vorschau in einem Behälter ist und der gesamte Video bezogenen Code in einem anderen View-Controller, sondern nur eine Ansicht anstelle einen Behälter mit sollte genauso gut funktionieren:

// 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) 

Dann erstellen Sie ein @IBAction für die Handhabung wenn der Benutzer die Aufnahmetaste drückt (I verwendet nur eine einfache Taste, die ich rot und rund gemacht):

@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() 
    } 
} 

Dann gibt alle links für Sie zu tun ist, um das Video zu (vermutlich) die Kamerarolle zu speichern . Aber ich werde das nicht aufnehmen. Sie müssen sich selbst etwas anstrengen. (Hinweis: UISaveVideoAtPathToSavedPhotosAlbum)

Also das ist es Leute. So verwenden Sie AVFoundation, um gleichzeitig ein Video aufzunehmen und Musik aus der Bibliothek abzuspielen.