【问题标题】:Using Spotify/background music with camera open在相机打开的情况下使用 Spotify/背景音乐
【发布时间】:2016-02-24 07:18:31
【问题描述】:

我有一个应用需要:

  • 使用应用时播放的背景音乐(例如,spotify)
  • 从 AVPlayer 观看电影时播放背景音乐
  • 录制视频时停止音乐

与 Snapchat 一样,相机视图控制器是“滑动视图”的一部分,因此始终处于开启状态。

但是,当打开和关闭应用程序时,音乐会发出短暂的“噼啪”噪音/声音,破坏音乐。

我在这里记录下来: https://soundcloud.com/morten-stulen/hacky-sound-ios (3 次)

我使用这些设置来更改 appdelegate didFinishLaunchingWithOptions 中的 AVAudiosession:

     do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord,withOptions: 
                [AVAudioSessionCategoryOptions.MixWithOthers,
                 AVAudioSessionCategoryOptions.DefaultToSpeaker])
            try AVAudioSession.sharedInstance().setActive(true)

        } catch {
            print("error")
        }

我使用 LLSimpleCamera 控件进行视频录制,并将会话设置为:

_session.automaticallyConfiguresApplicationAudioSession = NO;

似乎其他人对其他相机库也有同样的问题: https://github.com/rFlex/SCRecorder/issues/127

https://github.com/rFlex/SCRecorder/issues/224

这家伙删除了 audioDeviceInput,但我有点需要它来录制视频。 https://github.com/omergul123/LLSimpleCamera/issues/48

我也尝试过使用 Apple 的代码“AvCam”,但我仍然遇到同样的问题。 Snapchat 是如何做到这一点的?!

任何帮助将不胜感激,我很乐意提供更多信息或代码!

【问题讨论】:

  • 您找到解决方案了吗?我需要同样的东西,但无法实现。
  • 我找到了一个解决方案,但它不是最优的。我在开始录制时添加了 audiodeviceInput ( [self.session addInput:_audioDeviceInput]; ),并在完成后将其删除。同时我将 AVAudioSession Category 设置为 AVAudioSessionCategoryPlayAndRecord,之后我也将其切换回来。为了补偿奇怪的相机 UI 行为,我在顶部淡入和淡出模糊视图。
  • 是的,我试过了。不是你说的最理想的。我还尝试使用 MixWithOthers、DuckOthers、DefaultToSpeaker 保留 PlayAndRecord 类别,但是当我启动会话时背景音乐停止了一秒钟。此外,音乐太大声(即使是 Duckothers),播放时我听不清自己的声音。
  • 如果您在没有 audioInput 和 AVAudioSessionCategoryAmbient 的情况下启动会话,它不应该停止。我有没有 audioInput 的 AVAudioSessionCategoryAmbient ,它可以让您在拍照时听背景音乐以及应用程序中的所有其他内容,但在录制视频时不会录制声音。因此,我在开始录制时添加了 audioInput,同时切换到 AVAudioSessionCategoryPlayAndRecord 将淡出音乐。 (顺便说一句,如果您在拍摄时听音乐,即使是 Snapchat 在切换音频会话时也会发出噼啪声。我不相信有最佳解决方案)

标签: ios objective-c iphone audio avaudiosession


【解决方案1】:

我做了一些与您想要的类似的事情,但没有相机方面,但我认为这会做您想要的。我的应用程序允许与非全屏视频/音频混合的背景音频。当用户播放音频文件或全屏视频文件时,我会完全停止背景音频。

我先 SoloAmbient 然后 Playback 的原因是因为我允许在设备锁定时在后台播放我的音频。转到 SoloAmbient 将停止所有背景音乐播放,然后切换到 Playback 让我的音频在应用程序和后台播放。

这就是为什么您会看到调用了在 Unload 方法中设置锁定屏幕信息的方法的原因。在这种情况下,它会将其清空,因此没有锁屏信息。

在 AppDelegate.swift 中

//MARK: Audio Session Mixing
func allowBackgroundAudio()
{
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: .MixWithOthers)
    } catch {
        NSLog("AVAudioSession SetCategory - Playback:MixWithOthers failed")
    }
}

func preventBackgroundAudio()
{
    do {
        //Ask for Solo Ambient to prevent any background audio playing, then change to normal Playback so we can play while locked
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategorySoloAmbient)
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    } catch {
        NSLog("AVAudioSession SetCategory - SoloAmbient failed")
    }
}

当我想停止背景音频时,例如播放应该单独播放的音轨时,我会执行以下操作:

在 MyAudioPlayer.swift 中

func playUrl(url: NSURL?, backgroundImageUrl: NSURL?, title: String, subtitle: String) 
{
    ForgeHelper.appDelegate().preventBackgroundAudio()

    if _mediaPlayer == nil {
        self._mediaPlayer = MediaPlayer()
        _mediaPlayer!.delegate = self
    }

    //... Code removed for brevity
}

当我播放完媒体后,我会这样做:

private func unloadMediaPlayer()
{
    if _mediaPlayer != nil {
        _mediaPlayer!.unload()
        self._mediaPlayer = nil
    }

    _controlView.updateForProgress(0, duration: 0, animate: false)

    ForgeHelper.appDelegate().allowBackgroundAudio()
    setLockScreenInfo()
}

希望对你有所帮助!

【讨论】:

  • 感谢您的回答!但是,与相机打交道时会有所不同,因为相机需要音频输入。根据Apple Documentation,AVAudioSessionCategoryPlayback 只允许输出。使用您的示例代码,背景音乐播放正常,但相机无法启动。
猜你喜欢
  • 2016-05-12
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2015-11-19
  • 2017-07-02
相关资源
最近更新 更多