Naren Krish
Naren Krish

Reputation: 269

Audio Stream via firebase

I have uploaded some songs in firebase Storage directly,I just want to stream the song in AVAudioPlayer. Below is the code which I am trying:

var mainRef: FIRStorageReference {
    return FIRStorage.storage().reference(forURL: "gs://musicapp-d840c.appspot.com")
}

var audioStorageRef: FIRStorageReference{
    return mainRef.child("SongsPath")
}

audioStorageRef.downloadURL { url, error in

    if let error = error {
        print(error.localizedDescription)
    } else {

        if let url = url {

            do {
                self.audioPlayer = try AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: String(describing: url)) as URL)
                self.audioPlayer.play()
            } catch  {}

            let storyboard  = UIStoryboard(name: "AudioPlayer", bundle: nil)
            let audioVc = storyboard.instantiateViewController(withIdentifier: "AudioPlayerViewController") as! AudioPlayerViewController
            audioVc.playThisSong = String(describing: url)

            self.present(audioVc, animated: false, completion: nil)
        }
    }
}

Here the song url from the firebase is passing but it is skipping the self.audioPlayer.play. ,I just want to stream the audio. Can I get a proper solution for this?

Upvotes: 1

Views: 2259

Answers (1)

Eric Armstrong
Eric Armstrong

Reputation: 666

This is not an answer for streaming.

This is an answer for downloading the file, storing it locally, and playing the audio after the file has finished downloading.

Get a Firebase storage reference using a path string with the file extension. Get a file url to store it on the device using the same path string that we use for the Firebase storage reference.

Initiate the download task using write(toFile: URL). Store the download task in a variable to add observers. When the download is successful, play the audio.

In Swift 4:

var player: AVAudioPlayer?

let pathString = "SongsPath.mp3"
let storageReference = Storage.storage().reference().child(pathString)
let fileUrls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)

guard let fileUrl = fileUrls.first?.appendingPathComponent(pathString) else {
    return
}

let downloadTask = storageReference.write(toFile: fileUrl)

downloadTask.observe(.success) { _ in
    do {
        self.player = try AVAudioPlayer(contentsOf: fileUrl)
        self.player?.prepareToPlay()
        self.player?.play()
    } catch let error {
        print(error.localizedDescription)
    }
}

This is minimal code. Implement error handling as you see fit.

Firebase example of downloading locally

Upvotes: 1

Related Questions