我使用"initWithUrl:“方法初始化AVPlayerItem。
问题是当初始化中断时(例如连接丢失)
假设我们有以下内容:
self.avPlayerItem = [[AVPlayerItem alloc] initWithUrl:url];发布于 2015-09-17 06:55:47
在处理依赖于互联网连接的代码时,你必须确保在出现问题时会启动故障安全机制,因为在某些情况下会发生这种情况。
应该做什么?
1)在后台线程上执行所有依赖于互联网连接的代码。你不会想阻塞UI的。
2)如有可能,请在使用前对下载的文件进行验证。
有不同的方法可以做到这一点,但在我的头顶上,我认为我可以使用NSURLConnection或类似的应用程序接口下载文件到一个临时文件夹。在后台线程上。
下载时,我会使用临时URL初始化AVAsset。AVAsset有一些很好的属性,比如playable,可以帮助你检查下载的文件是否正常。(NSURLConnectionDelegate还提供了一种方法,用于通知下载是否出错。)
如果你已经做到了这一点,那么你可以用你的AVAsset创建一个AVPlayerItem,然后你就可以开始工作了。如果您不想保留下载的内容,请记住在某个时候清除临时文件夹中的内容。
请记住,您希望在主线程上播放文件,但所有其他加载和检查可能最好在后台线程上完成;您肯定希望在后台线程中使用NSURLConnection。
发布于 2016-10-22 19:55:00
首先将AVPlayerItem存储在NSPurgeableData对象中,并从中播放;将数据对象存储在NSCache对象中,以便在对象播放后或连接断开时自动将该对象从内存中逐出,并用新的AVPlayerItem替换以前的all(无论您描述的是什么特定问题,您都应该执行所有这些操作)。下面是一些代码,可以帮助您入门:
void (^cachePlayerItem)(AVPlayerItem *, NSCache *, NSString *) = ^(AVPlayerItem *playerItem, NSCache *cache, NSString *key) {
NSURL *fileURL = [(AVURLAsset *)playerItem.asset URL];
NSPurgeableData *data = [NSPurgeableData dataWithContentsOfURL:fileURL];
[data beginContentAccess];
[cache setObject:data forKey:key];
[data endContentAccess];
[data discardContentIfPossible];
};将此块放在实现文件中的任何位置,并在头文件中使用以下命令定义它:
typedef void (^cachePlayerItemBlock)(AVPlayerItem *, NSCache *, NSString *);使用以下命令在方法中调用它:
cachePlayerItem(playerItem, playerItems, phAsset.localIdentifier);然而,playerItem是AVPlayerItem,playerItems是NSCache缓存,并且根据您从中获取AVPlayerItem的资产类型,它是某种唯一的标识符(或者,在上面的示例中,是与其相关的资产)。
顺便说一句,我在AppDelegate中相应地设置了缓存:
- (NSCache *)thumbnailCache {
__block NSCache *t = self->_thumbnailCache;
if (!t) {
t = [[NSCache alloc] init];
[t setName:@"Thumbnail Cache"];
[t setEvictsObjectsWithDiscardedContent:TRUE];
[t setCountLimit:self.assetsFetchResults.count];
self->_thumbnailCache = t;
}
return t;
}这不仅确保了对缓存的全局访问,而且还确保了缓存的一个实例,这在缓存AVPlayerItems时尤其重要,因为它们可能很大。
要在AppDelegate中创建全局可访问的缓存,请将以下内容分别添加到头文件和实现文件中:
+ (AppDelegate *)sharedAppDelegate;...and:
+ (AppDelegate *)sharedAppDelegate
{
return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}要在其他类文件中引用缓存,请导入AppDelegate头文件,如果需要,还可以创建AppDelegate的sharedApplication方法的快捷方式:
#import "AppDelegate.h"
#define AppDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])在此过程中,缓存可以由...引用:
AppDelegate.thumbnailCache...instead的地址:
AppDelegate.sharedAppDelegate.thumbnailCachehttps://stackoverflow.com/questions/32614805
复制相似问题