AVPlayer не воспроизводится из NSCachesDirectory?

Привет, я пытаюсь воспроизвести видеофайлы из NSCachesDirectory. Плеер не загружает файлы из NSCachesDirectory в слой videoView.

Можно ли воспроизводить видео из памяти 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];

    }

person NextStep    schedule 17.09.2013    source источник


Ответы (2)


подход КВО. Добавить наблюдателя:

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.

person Oleg Shulakov    schedule 24.09.2013
comment
но я хочу играть с частичной загрузки... я могу играть после загрузки.... я хочу играть, пока данные загружаются в кэш-память.. ты получаешь - person NextStep; 25.09.2013
comment
может лучше инициировать AVPlayer с таким url NSURL *url = [NSURL URLWithString:@"http://myserver.com/test.mp3"]; вместо скачивания. - person Oleg Shulakov; 25.09.2013
comment
спасибо за вашу ценную поддержку ... но, чувак, мой URL-адрес загрузки исходит из Google Диска ... и я не могу напрямую воспроизводить файл Google Диска, потому что он запрашивает аутентификацию ... я не могу получить авторизованный файл Google Диска. поэтому я планирую воспроизводить из NSdata из кэш-памяти... я могу воспроизводить аудио из NSdata... но видеофайлы вообще не загружаются.... надеюсь, вы сможете понять мою проблему... - person NextStep; 25.09.2013
comment
... привет, сэр, есть идеи - person NextStep; 26.09.2013
comment
Я попытался воспроизвести обрезанное видео и обнаружил, что 10 000 байт недостаточно для начала воспроизведения. Конечно, все зависит от качества видео. В моем случае 100000 байт хватило примерно на 1 секунду. Размер видеофайла составил 5510872 байта. Итак, попробуйте увеличить критерий. - person Oleg Shulakov; 26.09.2013
comment
k я тоже увеличил размер байта, чем тоже нет ответа - person NextStep; 26.09.2013

Я не уверен, что [статус avPlayer] == AVPlayerStatusReadyToPlay возвращает YES в этом случае. AVPlayer требуется некоторое время, чтобы загрузить элемент. Вы можете играть сразу, даже если это лучший способ отслеживать AVPlayer.status с помощью KVO.

Лукас

РЕДАКТИРОВАТЬ: Попробуйте так (быстрая победа):

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];
person awolCZ    schedule 24.09.2013
comment
После того, как вы создадите свой AVPlayerItem, добавьте наблюдатель для значения статуса следующим образом: - person awolCZ; 24.09.2013
comment
Я думаю, что быстрый выигрыш заключается в удалении условия if ( !([avPlayer status] == AVPlayerStatusReadyToPlay) && (dataReceivedSoFar.length >10000)) Просто попробуйте прикрепить AVPlayerLayer и вызвать [avPlayer play] после того, как вы создали AVPlayerLayer в своем коде. - person awolCZ; 24.09.2013
comment
Кроме того, я не уверен, что означает dataReceivedSoFar, но я считаю, что AVPlayer не может воспроизводить частично загруженные файлы. - person awolCZ; 24.09.2013