AVPlayer:在Swift中播放“动态”转码音频文件

时间:2018-10-05 07:51:57

标签: ios swift avfoundation avplayer

我正在一个项目,该项目迅速实现了OpenHome库。我正在Renderer提供程序端工作,这意味着代理在同一网络内发送媒体项URL进行播放。取得网址后,应用程序需要设置AVPlayer并播放。

提供的网址如下:

如果URL包含“ orig”,则表示文件与扩展名匹配。 另一方面,如果URL包含“ trans”,则表示所提供的文件将与扩展名匹配,但将在转换时即时提供。

当我输入URL时,此技术可用于Sonos,Android和Chrome浏览器。但是,它不适用于iOS和Safari(考虑到我做对了)。

我要附加一个处理该过程的测试ViewController

import UIKit
import AVFoundation

class ViewController: UIViewController {

    private var avAudioPlayer:AVPlayer!
    private var avAudioSession:AVAudioSession = AVAudioSession.sharedInstance()

    override func viewDidLoad() {
        super.viewDidLoad()

        try! avAudioSession.setCategory(.playback, mode: .default, options: [])
        try! avAudioSession.setActive(true)

        let urlString = "http://192.168.1.123:8088/ext/trans/audio/2249.mp3"
        let url = URL(string: urlString)!
        avAudioPlayer = AVPlayer(url: url)


        avAudioPlayer?.addObserver(self, forKeyPath: "status", options: [], context: nil)

    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        if keyPath == "status"{

            switch avAudioPlayer.status{
            case .readyToPlay:
                print("Hey: Ready To Play")
                avAudioPlayer.play()
            case .failed:
                print("FAILED OH Nooo!")
            case .unknown:
                print("Something went wrong but ...")
            }

        }

    }

}
  • NSAllowsArbitraryLoads设置为true

我附上了一些状态数据:

print("A Reason = \(String(describing: avAudioPlayer.reasonForWaitingToPlay?.rawValue))")
-->A Reason = "AVPlayerWaitingWhileEvaluatingBufferingRateReason"

print("TIME Control Status = \(avAudioPlayer.timeControlStatus.rawValue)")
-->TIME Control Status = 1

谢谢。

1 个答案:

答案 0 :(得分:0)

事实证明,提供方与Apple媒体服务不兼容。 AVPlayer实际上会自行处理。