无法使用 AVPlayer 播放来自 URL 的视频,错误:NSOSStatusErrorDomain Code=-2



我使用了一个库https://github.com/VeinGuo/VGPlayer在我的自定义视图中播放视频。但我面临错误

Error Domain=AVFoundationErrorDomain Code=-11800"操作无法完成"UserInfo={NSLocalizedFailureReason=发生未知错误(-2(,NSLocalizedDescription=操作无法完成,NSUnderlyingError=0x281933e40{Error Domain=NSOSStatusErrorDomain Code=-2"(null("}

我刚刚在GitHub示例的项目中实现了嵌入tableView的单元格。由于出错的原因,我刚刚创建了一个新的空项目,并在其中做了同样的事情,我只是感到震惊,它在其中工作得很好(相同的设备,相同的xcode(。我研究了很多,但我没有发现我的项目中的实际问题是什么。请帮帮我!

我用这个网址播放视频。它在我的新项目中运行良好,但在我的实际项目中不起作用。

以下是VGEmbedTableViewController文件中的addPlayer方法。其他代码与gitHub存储库的示例相同。我只更改了网址。

func addPlayer(_ cell: UITableViewCell) {
if player != nil {
player.cleanPlayer()
}
configurePlayer()
cell.contentView.addSubview(player.displayView)
player.displayView.snp.makeConstraints {
$0.edges.equalTo(cell)
}
player.replaceVideo(URL(string:"https://s3.eu-west-2.amazonaws.com/gymstar-app/7A77786B4870594D7165625046614E74/post_videos/postVideo1582781434.005436.mp4")!)
player.play()
}

我使用了简单的swift代码来播放内容。

func play() {
// Get AVPlayerItem

let url = URL(string:"https://s3.eu-west-2.amazonaws.com/gymstar-app/7A77786B4870594D7165625046614E74/post_videos/postVideo1582781434.005436.mp4")

//let url = URL(string:"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8")

self.asset = AVURLAsset(url: url!)
self.playerItem = AVPlayerItem(asset: asset!)
// Get AVPlayer
self.player = AVPlayer(playerItem: self.playerItem)
self.playerViewController = AVPlayerViewController()
self.playerViewController!.player = self.player;
self.present(self.playerViewController!, animated: true) {
self.player?.play()
}
}

我的问题通过清除VGPlayer库保存的缓存来解决。它们提供了清除缓存和删除文件的方法,

open func cleanAllCache() {
ioQueue.sync {
do {
let cacheDirectory = VGPlayerCacheManager.cacheDirectory()
try fileManager.removeItem(atPath: cacheDirectory)
} catch { }
}
}
open func cleanOldFiles(completion handler: (()->())? = nil) {
ioQueue.sync {
let cacheDirectory = VGPlayerCacheManager.cacheDirectory()
var (URLsToDelete, diskCacheSize, cachedFiles) = self.cachedFiles(atPath: cacheDirectory, onlyForCacheSize: false)
for fileURL in URLsToDelete {
do {
try fileManager.removeItem(at: fileURL)
} catch _ { }
}
if cacheConfig.maxCacheSize > 0 && diskCacheSize > cacheConfig.maxCacheSize {
let targetSize = cacheConfig.maxCacheSize / 2
let sortedFiles = cachedFiles.keysSortedByValue {
resourceValue1, resourceValue2 -> Bool in
if let date1 = resourceValue1.contentAccessDate,
let date2 = resourceValue2.contentAccessDate
{
return date1.compare(date2) == .orderedAscending
}
return true
}
for fileURL in sortedFiles {
let (_, cacheSize, _) = self.cachedFiles(atPath: fileURL.path, onlyForCacheSize: true)
diskCacheSize -= cacheSize
do {
try fileManager.removeItem(at: fileURL)
} catch { }
URLsToDelete.append(fileURL)
if diskCacheSize < targetSize {
break
}
}
}
DispatchQueue.main.async {
if URLsToDelete.count != 0 {
let cleanedHashes = URLsToDelete.map { $0.lastPathComponent }
NotificationCenter.default.post(name: .VGPlayerCacheManagerDidCleanCache, object: self, userInfo: [VGPlayerCacheManager.VGPlayerCleanCacheKey: cleanedHashes])
}
handler?()
}
}
}

最新更新