Sie wollen also Video aufnehmen und Spielmusik aus der Bibliothek des Benutzers zugleich? Suchen Sie nicht weiter. Unten ist die Antwort.Wie Video aufzeichnen und Audio gleichzeitig (swift Tutorial) spielen
Antwort
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.