【发布时间】:2020-05-28 21:53:32
【问题描述】:
有没有人成功地将音频文件存储在 Firebase 存储中,然后在 IOS 中流式传输相同的文件?
到目前为止,我已经成功地在 swift (.m4a) 中录制了音频,将文件上传到 firebase 存储,检索到如下所示的下载 url:
我将该音频存储在我的 firebase 数据库中,并将其导入一个名为“stream”的 var 中,并尝试将其传递给音频播放器,但没有成功...
我看到一些关于 Firestore 支持 Andriod 流式传输的信息,但与 IOS 无关。
有人可以在这里提供一些帮助吗?我是否需要使用其他存储服务来托管流 url?如果可能的话,我希望只使用 firebase 来启动我的 MVP。
@ObservedObject var audioPlayer = AudioPlayer()
var stream = ""
var body: some View {
VStack(alignment: .leading){
if audioPlayer.isPlaying == false {
Button(action: {
self.audioPlayer.startPlayback(audio: URL(string: self.stream)!)
}) {
Image(systemName: "play.circle")
.resizable()
.frame(width: 50, height: 50)
}
} else {
Button(action: {
self.audioPlayer.stopPlayback()
}) {
Image(systemName: "stop.fill")
.resizable()
.frame(width: 50, height: 50)
}
}
}
}
}
}
}
完整的音频播放器供参考!
音频播放器类:NSObject、ObservableObject、AVAudioPlayerDelegate {
let objectWillChange = PassthroughSubject<AudioPlayer, Never>()
var isPlaying = false {
didSet {
objectWillChange.send(self)
}
}
var audioPlayer: AVAudioPlayer!
func startPlayback (audio: URL) {
let playbackSession = AVAudioSession.sharedInstance()
do {
try playbackSession.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
} catch {
print("Playing over the device's speakers failed")
}
do {
audioPlayer = try AVAudioPlayer(contentsOf: audio)
audioPlayer.delegate = self
audioPlayer.play()
isPlaying = true
} catch {
print("Playback failed.")
}
}
func stopPlayback() {
audioPlayer.stop()
isPlaying = false
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
if flag {
isPlaying = false
}
}
}
【问题讨论】:
-
我应该添加一些上下文,我以名为“stream”的变量的形式从 Firebase DB 检索下载 URL。
-
AVAudioPlayer 不适用于远程 url,您可以下载它并将其用作数据。 stackoverflow.com/a/51733033/12208004
标签: swift firebase firebase-storage audio-streaming