首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对AVPlayerItem进行重装?

如何对AVPlayerItem进行重装?
EN

Stack Overflow用户
提问于 2015-09-17 01:15:53
回答 2查看 506关注 0票数 0

我使用"initWithUrl:“方法初始化AVPlayerItem。

问题是当初始化中断时(例如连接丢失)

假设我们有以下内容:

代码语言:javascript
复制
self.avPlayerItem = [[AVPlayerItem alloc] initWithUrl:url];

  1. 应该做什么?当同时断开连接时,avPlayerItem实例会发生什么情况?是否需要执行一些协议来确定初始化是否成功?

  1. 我注意到的是,一旦初始化被中断,那么下一次“成功”的avPlayerItem初始化根本没有音轨(它们在之前没有中断的情况下存在)要再次使用源中的音轨初始化avPlayerItem,用户需要再次关闭并打开应用程序。
EN

回答 2

Stack Overflow用户

发布于 2015-09-17 06:55:47

在处理依赖于互联网连接的代码时,你必须确保在出现问题时会启动故障安全机制,因为在某些情况下会发生这种情况。

应该做什么?

1)在后台线程上执行所有依赖于互联网连接的代码。你不会想阻塞UI的。

2)如有可能,请在使用前对下载的文件进行验证。

有不同的方法可以做到这一点,但在我的头顶上,我认为我可以使用NSURLConnection或类似的应用程序接口下载文件到一个临时文件夹。在后台线程上。

下载时,我会使用临时URL初始化AVAssetAVAsset有一些很好的属性,比如playable,可以帮助你检查下载的文件是否正常。(NSURLConnectionDelegate还提供了一种方法,用于通知下载是否出错。)

如果你已经做到了这一点,那么你可以用你的AVAsset创建一个AVPlayerItem,然后你就可以开始工作了。如果您不想保留下载的内容,请记住在某个时候清除临时文件夹中的内容。

请记住,您希望在主线程上播放文件,但所有其他加载和检查可能最好在后台线程上完成;您肯定希望在后台线程中使用NSURLConnection

票数 1
EN

Stack Overflow用户

发布于 2016-10-22 19:55:00

首先将AVPlayerItem存储在NSPurgeableData对象中,并从中播放;将数据对象存储在NSCache对象中,以便在对象播放后或连接断开时自动将该对象从内存中逐出,并用新的AVPlayerItem替换以前的all(无论您描述的是什么特定问题,您都应该执行所有这些操作)。下面是一些代码,可以帮助您入门:

代码语言:javascript
复制
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];
};

将此块放在实现文件中的任何位置,并在头文件中使用以下命令定义它:

代码语言:javascript
复制
typedef void (^cachePlayerItemBlock)(AVPlayerItem *, NSCache *, NSString *);

使用以下命令在方法中调用它:

代码语言:javascript
复制
cachePlayerItem(playerItem, playerItems, phAsset.localIdentifier);

然而,playerItem是AVPlayerItem,playerItems是NSCache缓存,并且根据您从中获取AVPlayerItem的资产类型,它是某种唯一的标识符(或者,在上面的示例中,是与其相关的资产)。

顺便说一句,我在AppDelegate中相应地设置了缓存:

代码语言:javascript
复制
- (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中创建全局可访问的缓存,请将以下内容分别添加到头文件和实现文件中:

代码语言:javascript
复制
+ (AppDelegate *)sharedAppDelegate;

...and:

代码语言:javascript
复制
+ (AppDelegate *)sharedAppDelegate
{
    return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}

要在其他类文件中引用缓存,请导入AppDelegate头文件,如果需要,还可以创建AppDelegate的sharedApplication方法的快捷方式:

代码语言:javascript
复制
#import "AppDelegate.h"

#define AppDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])

在此过程中,缓存可以由...引用:

代码语言:javascript
复制
AppDelegate.thumbnailCache

...instead的地址:

代码语言:javascript
复制
AppDelegate.sharedAppDelegate.thumbnailCache
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32614805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档