使用 AVAudioPlayer 从 HTTP POST 请求播放接收到的 NSData

Posted

技术标签:

【中文标题】使用 AVAudioPlayer 从 HTTP POST 请求播放接收到的 NSData【英文标题】:Playing received NSData from an HTTP POST request using AVAudioPlayer 【发布时间】:2016-04-14 07:58:56 【问题描述】:

这是实现本地 Web 服务器的 POST 处理程序的代码。它以 NSData((request as! GCDWebServerURLEncodedFormRequest).data) 的形式在从客户端设备上传的服务器上下载歌曲。

 webServer.addHandlerForMethod("POST",path:"/", requestClass: GCDWebServerURLEncodedFormRequest.self, processBlock:
        request in
 let html: String = String(format: "<html><body><p>hi</p></body></html>")
 NSLog("Request Args %hhd bkmbk", (request as! GCDWebServerURLEncodedFormRequest).hasBody())

 NSLog("Request Args %@ bkmbk", (request as! GCDWebServerURLEncodedFormRequest).contentType)

通过该方法,服务器端成功接收到歌曲文件的NSData。接收到的数据大小与发送的实际文件相对应。 当尝试播放接收到的歌曲时,它只播放其中的一部分,然后停止。但是,整个应用程序不会崩溃。

 do
  print((request as! GCDWebServerURLEncodedFormRequest).data.length)
  let player = try AVAudioPlayer(data: (request as! GCDWebServerURLEncodedFormRequest).data, fileTypeHint: "mp3")
  player.prepareToPlay()
  player.play()
        catch
           // ...
        
        return GCDWebServerDataResponse(HTML:html)
    )

上述所有方法都在 AppDelegate.swift 中执行,并在后台线程中执行。 非常感谢任何解决此问题的帮助。谢谢..!!

【问题讨论】:

【参考方案1】:

问题很可能是AVAudioPlayer 实例没有保留,因为它位于局部变量中。当return GCDWebServerDataResponse(HTML:html)被调用时,局部变量和播放器被销毁。

【讨论】:

以上是关于使用 AVAudioPlayer 从 HTTP POST 请求播放接收到的 NSData的主要内容,如果未能解决你的问题,请参考以下文章

无法在 swift 4 中使用 avaudioplayer 播放 http 音频

Xcode:无法停止从子类播放 AVAudioPlayer 音乐

swift AVAudioPlayer播放音频时声音太小

AVAudioPlayer currentTime 超过持续时间

如何使用 AVAudioPlayer 执行 .m4a 歌曲文件的流式传输?

Monotouch:尝试从使用 AVAudioPlayer 动态生成的文件中播放音频