AVPlayer:在 Swift 中播放“即时”转码音频文件
AVPlayer: Playing a “on the fly” Transcode Audio file in Swift
我正在开发一个在 swift 中实现 OpenHome 库的项目。我在渲染器提供商端工作,这意味着代理在同一网络内发送媒体项 URLs 进行播放。获取url后的应用需要设置AVPlayer播放
提供的URL如下:
- http://192.168.1.123:8088/ext/orig/audio/2249.flac
- http://192.168.1.123:8088/ext/trans/audio/2249.mp3
如果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
谢谢。
事实证明,提供商端与 Apple 媒体服务不兼容。 AVPlayer实际会自己处理。
我正在开发一个在 swift 中实现 OpenHome 库的项目。我在渲染器提供商端工作,这意味着代理在同一网络内发送媒体项 URLs 进行播放。获取url后的应用需要设置AVPlayer播放
提供的URL如下:
- http://192.168.1.123:8088/ext/orig/audio/2249.flac
- http://192.168.1.123:8088/ext/trans/audio/2249.mp3
如果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
谢谢。
事实证明,提供商端与 Apple 媒体服务不兼容。 AVPlayer实际会自己处理。