AVAsset 不适用于本地文件
AVAsset not working with local file
我正在我的应用程序中下载和缓存(使用 https://github.com/vdugnist/DVAssetLoaderDelegate)视频。当应用程序启动时,我检查下载的文件,如果它存在,我用本地文件初始化资产,否则,我用远程 URL 初始化它。然后,当下载完成后,我将视频文件写入缓存目录。我检查了写入的文件,它存在,并且是一个有效文件(我浏览了模拟器的文件系统并找到了该文件。它就在那里。)。
当我下次启动该应用程序时,我检查现有文件(已成功找到),我用它初始化播放器,但它从未加载。我没有收到任何错误,但缓冲区从未获得任何时间范围,视频无法播放,没有任何调用等。
这是我的代码:
asset = [self resolvedAssetWithURL:url];
playerItem = [AVPlayerItem playerItemWithAsset:asset];
player = [AVPlayer playerWithPlayerItem:playerItem];
其中:
-(AVAsset*)resolvedAssetWithURL:(NSURL*)url{
NSURL *localURL = [self localURLForCachedRemoteURL:url];
if(localURL){
#if DEBUG
NSLog(@"Using cached copy for video at %@", url.absoluteString);
#endif
videoIsLocal = YES;
return [AVURLAsset URLAssetWithURL:localURL options:nil];
}else{
return [self assetWithoutCacheForURL:url];
}
}
其中:
-(NSURL*)localURLForCachedRemoteURL:(NSURL*)remoteURL{
NSString *cachedPath = [Cache cachedVideoDataRelativePathForURLPath:remoteURL.absoluteString];
if(cachedPath){
if([TUStorage fileExistsAtRelativePath:cachedPath]){
return [NSURL fileURLWithPath:[TUStorage absolutePathForRelativePath:cachedPath]];
}else{
NSLog(@"Remote URL %@ has been cached at %@ but local copy was not found. Removing cache.", remoteURL.absoluteString, cachedPath);
[Cache removeCachedVideoDataForURLPath:remoteURL.absoluteString];
return nil;
}
}else{
return nil;
}
}
我在那里有一些自定义方法,但你明白了。文件在那里并且可以播放(当我远程加载没有问题时,它与实际播放视频的数据相同)。
我照顾过:
- 解析到正确的路径(指向缓存目录的路径每次都是随机的,我已经处理过了)。
- 在加载本地资源时使用
fileURLWithPath:
而不是常规的 URL 初始值设定项,如代码所示。
我做错了什么? (我在 iOS 11.2.6)
经过几个小时的调查,我偶然发现了这个问题:
Is it possible to make AVURLAsset work without a file extension?
问题本身解决了我的问题:我没有使用文件名扩展名。我已将 .mov
附加到文件名,它开始工作了。
我正在我的应用程序中下载和缓存(使用 https://github.com/vdugnist/DVAssetLoaderDelegate)视频。当应用程序启动时,我检查下载的文件,如果它存在,我用本地文件初始化资产,否则,我用远程 URL 初始化它。然后,当下载完成后,我将视频文件写入缓存目录。我检查了写入的文件,它存在,并且是一个有效文件(我浏览了模拟器的文件系统并找到了该文件。它就在那里。)。
当我下次启动该应用程序时,我检查现有文件(已成功找到),我用它初始化播放器,但它从未加载。我没有收到任何错误,但缓冲区从未获得任何时间范围,视频无法播放,没有任何调用等。
这是我的代码:
asset = [self resolvedAssetWithURL:url];
playerItem = [AVPlayerItem playerItemWithAsset:asset];
player = [AVPlayer playerWithPlayerItem:playerItem];
其中:
-(AVAsset*)resolvedAssetWithURL:(NSURL*)url{
NSURL *localURL = [self localURLForCachedRemoteURL:url];
if(localURL){
#if DEBUG
NSLog(@"Using cached copy for video at %@", url.absoluteString);
#endif
videoIsLocal = YES;
return [AVURLAsset URLAssetWithURL:localURL options:nil];
}else{
return [self assetWithoutCacheForURL:url];
}
}
其中:
-(NSURL*)localURLForCachedRemoteURL:(NSURL*)remoteURL{
NSString *cachedPath = [Cache cachedVideoDataRelativePathForURLPath:remoteURL.absoluteString];
if(cachedPath){
if([TUStorage fileExistsAtRelativePath:cachedPath]){
return [NSURL fileURLWithPath:[TUStorage absolutePathForRelativePath:cachedPath]];
}else{
NSLog(@"Remote URL %@ has been cached at %@ but local copy was not found. Removing cache.", remoteURL.absoluteString, cachedPath);
[Cache removeCachedVideoDataForURLPath:remoteURL.absoluteString];
return nil;
}
}else{
return nil;
}
}
我在那里有一些自定义方法,但你明白了。文件在那里并且可以播放(当我远程加载没有问题时,它与实际播放视频的数据相同)。
我照顾过:
- 解析到正确的路径(指向缓存目录的路径每次都是随机的,我已经处理过了)。
- 在加载本地资源时使用
fileURLWithPath:
而不是常规的 URL 初始值设定项,如代码所示。
我做错了什么? (我在 iOS 11.2.6)
经过几个小时的调查,我偶然发现了这个问题:
Is it possible to make AVURLAsset work without a file extension?
问题本身解决了我的问题:我没有使用文件名扩展名。我已将 .mov
附加到文件名,它开始工作了。