在不停止 sound/music 的情况下从设备录制视频
Recording a Video without stopping sound/music from device
我正在使用 Swift 的 AVFoundation 在 iOS 中捕获视频。但是当我使用 Apple Music/Spotify 播放歌曲然后单击我的应用程序的录制按钮时,它 pauses/stops 音乐然后录制视频。我如何防止这种情况发生?
这是我的代码:
@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()
}
}
注意我注释掉了 captureSession.addInput(audioInput)
。如果我删除该代码,该应用程序能够录制视频,它不会 pause/stop 音乐,但视频输出没有声音。有解决办法吗?
可以参考这篇
的回答
我已经使用 SCRecorder 库实现了相同的功能,但也可以使用 AVCaptureSession 实现。
我自己设法解决了这个问题。该行:AVAudioSessionCategoryOptions.MixWithOthers
不执行任何操作。我将其移至选项:
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [AVAudioSessionCategoryOptions.MixWithOthers])
成功了!
这是 swift 中对我有用的东西,它与杰森的回答本质上是一样的,但 swift.
将此代码添加到您的
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?){
add your laucher code
let audioSession = AVAudioSession.sharedInstance()
do {
// Set the audio session category, mode, and options.
try audioSession.setCategory(.playAndRecord, options: [.mixWithOthers,.defaultToSpeaker,.allowBluetooth])
try audioSession.setActive(true)
} catch {
print("Failed to set audio session category.")
}
}
然后在您设置捕获会话的文件中
captureSession.automaticallyConfiguresApplicationAudioSession = false
本质上,与其他选项混音的工作原理如文档 "option that indicates whether audio from this session mixes with audio from active sessions in other audio apps" (https://developer.apple.com/documentation/avfoundation/avaudiosession/categoryoptions) 中所述,并且默认为扬声器允许在与其他选项混音时让音乐响亮。
我正在使用 Swift 的 AVFoundation 在 iOS 中捕获视频。但是当我使用 Apple Music/Spotify 播放歌曲然后单击我的应用程序的录制按钮时,它 pauses/stops 音乐然后录制视频。我如何防止这种情况发生?
这是我的代码:
@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()
}
}
注意我注释掉了 captureSession.addInput(audioInput)
。如果我删除该代码,该应用程序能够录制视频,它不会 pause/stop 音乐,但视频输出没有声音。有解决办法吗?
可以参考这篇
我已经使用 SCRecorder 库实现了相同的功能,但也可以使用 AVCaptureSession 实现。
我自己设法解决了这个问题。该行:AVAudioSessionCategoryOptions.MixWithOthers
不执行任何操作。我将其移至选项:
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [AVAudioSessionCategoryOptions.MixWithOthers])
成功了!
这是 swift 中对我有用的东西,它与杰森的回答本质上是一样的,但 swift.
将此代码添加到您的
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?){
add your laucher code
let audioSession = AVAudioSession.sharedInstance()
do {
// Set the audio session category, mode, and options.
try audioSession.setCategory(.playAndRecord, options: [.mixWithOthers,.defaultToSpeaker,.allowBluetooth])
try audioSession.setActive(true)
} catch {
print("Failed to set audio session category.")
}
}
然后在您设置捕获会话的文件中
captureSession.automaticallyConfiguresApplicationAudioSession = false
本质上,与其他选项混音的工作原理如文档 "option that indicates whether audio from this session mixes with audio from active sessions in other audio apps" (https://developer.apple.com/documentation/avfoundation/avaudiosession/categoryoptions) 中所述,并且默认为扬声器允许在与其他选项混音时让音乐响亮。