Подтвердить что ты не робот

Использование Spotify/фоновой музыки с открытой камерой

У меня есть приложение, которое должно иметь:

  • Воспроизведение фоновой музыки при использовании приложения (например, определение)
  • Фоновая музыка, воспроизводимая во время просмотра фильма из AVPlayer
  • Остановка музыки при записи видео

Как и Snapchat, камера-viewcontroller является частью "swipeview" и поэтому всегда включена.

Однако при открытии и закрытии приложения музыка создает короткий "треск" шума/звука, который разрушает музыку.

Я записал его здесь: https://soundcloud.com/morten-stulen/hacky-sound-ios (3 вхождения)

Я использую эти настройки для изменения AVAudiosession в appdelegate didFinishLaunchingWithOptions:

     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 делает это?!

Любая помощь будет принята с благодарностью, и я с радостью предоставит вам дополнительную информацию или код!

4b9b3361

Ответ 1

Я делаю что-то похожее на то, что вы хотите, но без аспект камеры, но я думаю, что это будет делать то, что вы хотите. Мое приложение позволяет фоновое аудио, которое будет смешиваться с не полноэкранным видео/аудио. Когда пользователь воспроизводит аудиофайл или полноэкранный видеофайл, я полностью останавливаю фоновый звук.

Причина, по которой я делаю SoloAmbient, а затем Воспроизведение, - это то, что я разрешаю воспроизведение своего звука в фоновом режиме, когда устройство заблокировано. Переход SoloAmbient остановит воспроизведение всех фоновых музыкальных файлов, а затем переключится на Воспроизведение, чтобы мой звук воспроизводился как в приложении, так и в фоновом режиме.

Вот почему вы видите вызов метода, который устанавливает информацию экрана блокировки в методе 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()
}

Надеюсь, это поможет вам!