![](/img/trans.png)
[英]Video playback issues only on iOS 13 with AVPlayerViewController and AVPlayer when using HLS video
[英]Issues when previewing .flac files with AVPlayerViewController
我正在使用AVPlayerViewController
在我的應用程序中預覽所有格式的音頻。
一切正常,但在我添加了對.flac
文件的支持后,它出現了錯誤。
播放器有時會正確加載視頻,有時則不會。 其他格式永遠不會發生這種情況,例如.mp3
。
這是正確加載視頻和未正確加載視頻時的樣子(第一張圖片是一切正常的時候):
所有音頻格式的邏輯都是一樣的:
private lazy var _player = AVPlayer()
private lazy var _playerViewController = AVPlayerViewController()
func playAudio(correctUrl: URL) {
var item = AVPlayerItem(url: correctUrl)
self._player.replaceCurrentItem(with: item)
self._playerViewController.player = self._player
self.registerForAVPlayerNotifications()
self._playerViewController.player?.play()
}
嘗試將資產加載為AVURLAsset
並檢查可能的加載錯誤。
func loadAsset(_ streamUrl: URL,completionAfterLoad: ((AVPlayerItem) -> Void)? = nil) {
let asset = AVURLAsset(url: streamUrl, options: nil)
let assetKeys = [
"playable",
"tracks",
"duration"
]
// Create a new AVPlayerItem with the asset and an
// array of asset keys to be automatically loaded
asset.loadValuesAsynchronously(forKeys: assetKeys, completionHandler: {
DispatchQueue.main.async {
var error: NSError? = nil
var status = asset.statusOfValue(forKey: "playable", error: &error)
switch status {
case .loaded:
print("loaded\n\(String(describing: error?.localizedDescription))")
case .failed:
print("failed\n\(String(describing: error?.localizedDescription))")
case .cancelled:
print("cancelled\n\(String(describing: error?.localizedDescription))")
default:
print("default\n\(String(describing: error?.localizedDescription))")
}
status = asset.statusOfValue(forKey: "tracks", error: &error)
switch status {
case .loaded:
print("loaded\n\(asset.tracks)")
case .failed:
print("failed\n\(String(describing: error?.localizedDescription))")
case .cancelled:
print("cancelled\n\(String(describing: error?.localizedDescription))")
default:
print("default\n\(String(describing: error?.localizedDescription))")
}
// If loading of duration fails, stream plylist is in wrong format (e.g. missing version number etc.)
status = asset.statusOfValue(forKey: "duration", error: &error)
switch status {
case .loaded:
print("loaded\n\(asset.tracks)")
case .failed:
print("failed\n\(String(describing: error?.localizedDescription))")
case .cancelled:
print("cancelled\n\(String(describing: error?.localizedDescription))")
default:
print("default\n\(String(describing: error?.localizedDescription))")
}
print("tracks\n\(asset.tracks(withMediaType: .audio))")
let playerItem = AVPlayerItem(asset: asset, automaticallyLoadedAssetKeys: assetKeys)
completionAfterLoad?(playerItem) // perform any action to happen after playlist is completed loading
}
})
}
// Usage:
let avPLayer = AVPlayer()
let url = URL(string: "")!
loadAsset(url,completionAfterLoad: { playerItem in
avPLayer.replaceCurrentItem(with: playerItem)
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.