Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Spotify/background music with camera open

I have an app that needs to have:

  • Background music playing while using the app (eg. spotify)
  • Background music playing while watching movie from AVPlayer
  • Stop the music when recording a video

Like Snapchat, the camera-viewcontroller is part of a "swipeview" and therefore always on.

However, when opening and closing the app, the music makes a short "crack" noise/sound that ruins the music.

I recorded it here: https://soundcloud.com/morten-stulen/hacky-sound-ios (3 occurrences)

I use these settings for changing the AVAudiosession in the appdelegate didFinishLaunchingWithOptions:

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

        } catch {
            print("error")
        }

I use the LLSimpleCamera control for video recording and I've set the session there to:

_session.automaticallyConfiguresApplicationAudioSession = NO;

It seems others have the same problem with other camera libraries as well: https://github.com/rFlex/SCRecorder/issues/127

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

This guy removed the audioDeviceInput, but I kinda need that for recording video. https://github.com/omergul123/LLSimpleCamera/issues/48

I also tried with Apple's code "AvCam", and I still have the same issue. How does Snapchat do this?!

Any help would be greatly appreciated, and I'll gladly provide more info or code!

like image 933
Morten Stulen Avatar asked Nov 21 '15 23:11

Morten Stulen


1 Answers

I do something similar to what you're wanting, but without the camera aspect, but I think this will do what you want. My app allows background audio that will mix with non-fullscreen video/audio. When the user plays an audio file or a full screen video file, I stop the background audio completely.

The reason I do SoloAmbient then Playback is because I allow my audio to be played in the background when the device is locked. Going SoloAmbient will stop all background music playing and then switching to Playback lets my audio play in the app as well as in the background.

This is why you see a call to a method that sets the lock screen information in the Unload method. In this case, it is nulling it out so that there is no lock screen info.

In 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")
    }
}

When I want to stop background audio, for example when playing an audio track that should be alone, I do the following:

In 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
}

And when I'm done with my media playing, I do this:

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

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

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

Hope this helps you out!

like image 70
Jared Schnelle Avatar answered Sep 24 '22 08:09

Jared Schnelle