ios - porque - Grabar un video sin detener el sonido/la música desde el dispositivo
mi iphone 6 graba video sin audio (2)
Estoy trabajando con AVFoundation de Swift para capturar un video en iOS. Pero cuando toco una canción usando Apple Music / Spotify, hago clic en el botón de grabación de mi aplicación, pausa / detiene la música y luego graba el video. ¿Cómo evito que eso suceda?
Aquí está mi código:
@IBAction func record_video(sender: AnyObject) {
var initialOutputURL = NSURL(fileURLWithPath: "")
do
{
initialOutputURL = try NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true).URLByAppendingPathComponent("output").URLByAppendingPathExtension("mov")
}catch
{
print(error)
}
if !isRecording
{
isRecording = true
if let outputs = captureSession.outputs as? [AVCaptureOutput] {
for output in outputs {
captureSession.removeOutput(output)
}
}
do
{
try audioSession.setCategory(AVAudioSessionCategoryAmbient)
}
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)")
}
UIView.animateWithDuration(0.5, delay: 0.0, options: [.Repeat, .Autoreverse, .AllowUserInteraction], animations: { () -> Void in
self.record.transform = CGAffineTransformMakeScale(0.75, 0.75)
}, completion: nil)
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")
}
let videoInput: AVCaptureDeviceInput
do
{
videoInput = try AVCaptureDeviceInput(device: captureDevice)
// 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)")
}
videoFileOutput = AVCaptureMovieFileOutput()
captureSession.addOutput(videoFileOutput)
captureSession.sessionPreset = AVCaptureSessionPresetHigh
captureSession.automaticallyConfiguresApplicationAudioSession = false
videoFileOutput?.startRecordingToOutputFileURL(initialOutputURL, recordingDelegate: self)
}
catch let error
{
NSLog("Error Getting Input Device: /(error)")
}
}
else
{
isRecording = false
UIView.animateWithDuration(0.5, delay: 0, options: [], animations: { () -> Void in
self.record.transform = CGAffineTransformMakeScale(1.0, 1.0)
}, completion: nil)
record.layer.removeAllAnimations()
videoFileOutput?.stopRecording()
}
}
Tenga en cuenta que comenté captureSession.addInput(audioInput)
. Si elimino ese código, la aplicación puede grabar el video, no pausa ni detiene la música, pero la salida de video no tiene sonido. ¿Hay una solución para esto?
Pude resolver el problema por mi cuenta. La línea: AVAudioSessionCategoryOptions.MixWithOthers
no hace nada. Lo moví a las opciones: try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [AVAudioSessionCategoryOptions.MixWithOthers])
¡Funcionó!
Puede consultar la respuesta de esta pregunta
Implementé la misma característica usando SCRecorder Library, pero también se puede lograr con AVCaptureSession.