AVPlayer无法从NSCachesDirectory播放?

3

你好,我正在尝试从NSCachesDirectory播放视频文件。但是,播放器在videoView层面无法加载来自NSCachesDirectory的文件。

是否有可能从cacheDirectory内存中播放视频? 请给我建议...

我已经尝试过以下方法:

NSArray *myPathList = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);  
NSString *cachesDir    = [myPathList  objectAtIndex:0];   
NSString *songPath = [[NSString alloc] initWithString: [cachesDir stringByAppendingPathComponent:[NSString stringWithFormat:@"Song.%@", downloadURL]]];

NSURL *pathurl = [[NSURL  alloc] initFileURLWithPath:songPath];
NSLog(@"--pathurl---%@",pathurl);
avPlayer =[AVPlayer playerWithURL:pathurl];
self.avPlayerLayer =[AVPlayerLayer playerLayerWithPlayer:avPlayer];

if ( !([avPlayer status] == AVPlayerStatusReadyToPlay)   &&  (dataReceivedSoFar.length >10000))
    {

        avPlayerLayer.frame =CGRectMake(0, 0, 320, 450);

        [[self.videoView layer] addSublayer:avPlayerLayer];

        [avPlayer play];

         NSLog(@"Video IS Playing");

        [alert dismissWithClickedButtonIndex:0 animated:YES];

    }
2个回答

0
我不确定在这种情况下[avPlayer status] == AVPlayerStatusReadyToPlay会返回YES。AVPlayer加载项需要一些时间。即使使用KVO跟踪AVPlayer.status是更好的方式,但你仍应该可以立即播放。
Lukas
编辑:尝试这种方式(快速胜利):
NSArray *myPathList = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);  
NSString *cachesDir    = [myPathList  objectAtIndex:0];   
NSString *songPath = [[NSString alloc] initWithString: [cachesDir stringByAppendingPathComponent:[NSString stringWithFormat:@"Song.%@", downloadURL]]];

NSURL *pathurl = [[NSURL  alloc] initFileURLWithPath:songPath];
NSLog(@"--pathurl---%@",pathurl);
avPlayer =[AVPlayer playerWithURL:pathurl];

self.avPlayerLayer =[AVPlayerLayer playerLayerWithPlayer:avPlayer];
avPlayerLayer.frame =CGRectMake(0, 0, 320, 450);

[[self.videoView layer] addSublayer:avPlayerLayer];

[avPlayer play];

创建AVPlayerItem后,像这样添加状态值的观察器: - awolCZ
我认为快速解决的方法是删除条件 if ( !([avPlayer status] == AVPlayerStatusReadyToPlay) && (dataReceivedSoFar.length >10000))。只需尝试在代码中创建AVPlayerLayer后附加它并调用[avPlayer play]即可。 - awolCZ
1
另外,我不确定dataReceivedSoFar是什么意思,但我相信AVPlayer无法播放部分下载的文件。 - awolCZ

0

KVO方法。 添加观察者:

self.player = [AVPlayer playerWithURL:url];
[self.player addObserver:self forKeyPath:@"status" options:0 context:&PlayerStatusContext];

观察值

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {

    if (context == &PlayerStatusContext) {
        AVPlayer *thePlayer = (AVPlayer *)object;
        if ([thePlayer status] == AVPlayerStatusFailed) {
            NSError *error = [self.player error];
            // Respond to error: for example, display an alert sheet.
            return;
        }
        // Deal with other status change if appropriate.
        if ([thePlayer status] == AVPlayerStatusReadyToPlay) {
            [self play];
        }
    }
    // Deal with other change notifications if appropriate.
    [super observeValueForKeyPath:keyPath ofObject:object
           change:change context:context];
    return;
}

正在播放:

- (IBAction)play:sender {
    [self.player play];
}

编辑: 正如awolCZ所说,AVPlayer无法播放部分下载的文件。但是您可以使用类似于http://test.com/test.mp3的URL。


1
但我想要从部分下载中播放...我能够在下载后播放....我想要在数据正在加载到缓存内存时播放...你明白吗? - NextStep
也许最好使用这样的URL初始化AVPlayer:NSURL *url = [NSURL URLWithString:@"http://myserver.com/test.mp3"];而不是下载。 - Oleg Shulakov
感谢您的宝贵支持。但是,我的下载链接来自Google Drive。我无法直接播放Google Drive文件,因为它要求进行身份验证。我无法获取授权的Google Drive文件。所以我计划从缓存内存中的NSData播放。我能够从NSData播放音频,但视频文件根本无法加载。我希望您能理解我的问题。 - NextStep
你好先生,有什么想法吗? - NextStep
我试图播放经过裁剪的视频,发现10000字节不足以开始播放。当然,这取决于视频的质量。在我的情况下,大约需要100000字节才能播放1秒钟。视频文件大小为5510872字节。因此,请尝试增加标准。 - Oleg Shulakov
我增加了字节大小,但仍然没有响应。 - NextStep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接