MPMoviePlayerController timedMetadata возвращает пустое в iOS 5 - PullRequest
0 голосов
/ 01 февраля 2012

Я использую MPMoviePlayerController для потоковой передачи аудио.Я также использую его свойство timedMetadata, чтобы получить тег ID3 песни mp3.Это прекрасно работает в iOS 4.x, но не в iOS 5.

Вот фрагмент кода, который я использую:

MPMoviePlayerController* streamPlayer;    
// allocation and initialization code ...

- (void) metadataUpdate: (id) sender {
NSLog(@"GOT METADATA!!!!!");
if ([streamPlayer timedMetadata]!=nil && [[streamPlayer timedMetadata] count] > 0) {
    NSLog(@"metadata count = %d", [[streamPlayer timedMetadata] count]);
    for (MPTimedMetadata *metadata in [streamPlayer timedMetadata]) {
        NSLog(@"description %@", metadata.allMetadata);
        if ([[metadata.allMetadata valueForKey:@"key"] isEqualToString:@"title"]) {
            song.text = [metadata.allMetadata valueForKey:@"value"];
            filename = song.text;
        }
    }
}

} 

Более конкретно, под iOS 5 - metadata.allMetadataвозвращает пустой в приведенном выше коде, в то время как [[streamPlayer timedMetadata] count] равен 2.

это ошибка в iOS 5?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2012

Я вижу то же самое поведение и сообщу об ошибке. А пока я просто создаю свой собственный словарь для передачи.

- (void)metadataUpdate:(NSNotification *)notification  
{
    NSMutableDictionary *metaDict = [NSMutableDictionary dictionary];

    if ([self.moviePlayer timedMetadata]!=nil && [[self.moviePlayer timedMetadata] count] > 0) 
    {
        for (MPTimedMetadata *metadata in [self.moviePlayer timedMetadata]) 
        {
            [metaDict setObject:[metadata valueForKey:@"value"] forKey:[metadata valueForKey:@"key"]];
        }
        NSLog(@"Meta value:%@", metaDict);
    }
}

EDIT: В ответ на проблему playableDuration, ниже возвращает playableDuration для меня. Однако обратите внимание, что это НЕ общее время видео ... только то, что воспроизводится в данный момент, которое меняется в зависимости от того, что было загружено. (в случае HTTP Live Streaming)

- (void)viewDidLoad
{
    _moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:<your URL>];

    [self.moviePlayer.view setFrame: self.movieView.bounds];
    [self.movieView addSubview: self.moviePlayer.view];

    self.moviePlayer.shouldAutoplay = NO;
    [self.moviePlayer prepareToPlay];

}

- (IBAction)playGame:(UIButton *)sender
{
    if (self.moviePlayer.isPreparedToPlay) {
        [self.moviePlayer play];
        NSLog(@"%f", self.moviePlayer.playableDuration);
    }
}
1 голос
/ 02 марта 2012

Обнаружена проблема: виновником является свойство allMetadata для MPTimedMetadata.По какой-то причине это свойство возвращается пустым в iOS 5, тогда как в iOS 4 оно работает, как описано в документации.
Правильный код, который работал для меня, таков:

- (void) metadataUpdate: (id) sender {
  NSLog(@"GOT METADATA!!!!!");
  if ([streamPlayer timedMetadata]!=nil && [[streamPlayer timedMetadata] count] > 0) {
    for (MPTimedMetadata *metadata in [streamPlayer timedMetadata]) {
        if ([[metadata valueForKey:@"key"] isEqualToString:@"title"]) {
            song.text = [metadata valueForKey:@"value"];
            filename = song.text;
        }
    }
  }
} 
...