簡體   English   中英

使用 AVPlayerViewController 預覽 .flac 文件時出現問題

[英]Issues when previewing .flac files with AVPlayerViewController

我正在使用AVPlayerViewController在我的應用程序中預覽所有格式的音頻。
一切正常,但在我添加了對.flac文件的支持后,它出現了錯誤。

播放器有時會正確加載視頻,有時則不會。 其他格式永遠不會發生這種情況,例如.mp3

這是正確加載視頻和未正確加載視頻時的樣子(第一張圖片是一切正常的時候):
1張圖片 2圖像

所有音頻格式的邏輯都是一樣的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM