2013-02-22 1 views
2

У меня странная проблема с добавлением наблюдателя для граничного времени с использованием AVFoundation AVPlayer.macruby AVPlayer addBoundaryTimeObserverForTimes

player = AVPlayer.playerWithURL(NSURL.URLWithString(someurl)) 
player.play() 
player.addBoundaryTimeObserverForTimes([NSValue.valueWithCMTime(CMTimeMake(1,1))], queue: nil, usingBlock: -> { puts 'success' }) 

При выполнении этого кода в XCode, он падает на отладку кода ассемблера на добавление наблюдателя, в то время как нет никакой ошибки в консоли. С кем-то сталкивалась такая проблема?

ответ

-1

может быть, это действительно нуждается в очереди, чтобы быть передан в качестве параметра

попробовать это:

dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

[player addBoundaryTimeObserverForTimes:[NSValue.valueWithCMTime(CMTimeMake(1,1))] 
            queue: myQueue 
          usingBlock: -> { puts 'success' }]; 
+0

нет, передача нулевой очереди приводит к тому, что основная очередь используется, согласно документации – gadu

0

Я использую его, как это и это работает:

__block AVPlayer* blockPlayer = self.player;  //player is already initialised and set up; 
__block id obs; 

// Setup boundary time observer to trigger when audio really begins, 
// specifically after 1/3 of a second playback 

obs = [self.player addBoundaryTimeObserverForTimes: @[[NSValue valueWithCMTime:CMTimeMake(1, 10)]] 
              queue:NULL 
             usingBlock:^{ 

              // Raise a notificaiton when playback has started 
              [[NSNotificationCenter defaultCenter] postNotificationName:PLAYBACK_STARTED_NOTIFICATION object:nil]; 

              // Remove the boundary time observer 
              [blockPlayer removeTimeObserver:obs]; 
             }]; 
0

Если вы внимательно прочитайте документацию, вы увидите, что этот метод возвращает:

Возвращаемое значение: Непрозрачный объект, который вы передаете как аргумент removeTimeObserver: остановить наблюдение.

, а затем, что:

Вы должны сохранить возвращаемое значение до тех пор, как вы хотите, чтобы время наблюдатель должен быть вызван игроком. Каждый вызов этого метода должен быть сопряжен с соответствующим вызовом removeTimeObserver:

Ваш вопрос в том, что вы не сохраняя возвращаемое значение метода, вы просто вызов метода, поэтому время наблюдатель не вызываемый игроком.

Использование переменной __block должна реально работать здесь

player = AVPlayer.playerWithURL(NSURL.URLWithString(someurl)) 
player.play() 

__block id observer = player.addBoundaryTimeObserverForTimes([NSValue.valueWithCMTime(CMTimeMake(1,1))], queue: nil, usingBlock: -> 
{ 
    puts 'success' 
    player.removeTimeObserver(observer) // IMPORTANT, but careful. Read below* 
}) 

ниже *: Как Apple, подчеркивает, что вам нужно позвонить removeTimeObserver, и место, которое имеет больше смысла для меня было бы в блоке завершения , но, по крайней мере, в Obj C, Swift и большинстве других языков, это приведет к циклу сохранения. Вы можете обойти это в Obj C и Swift, объявив наблюдателя и игрока как block variables, чтобы вы могли безопасно ссылаться на них изнутри блока.

Если вы можете найти другое место для безопасного вызова метода removeTimeObserver, вам не нужно беспокоиться об этом.

В любом случае приведенный выше код будет исполнять блок, когда игрок занимает 1 секунду в песне/видео.

отметить также, что:

AV Foundation не гарантирует, чтобы вызвать Ваш блок для каждого интервала или границы прошло. AV Foundation не вызывает блок, если выполнение ранее вызванного блока не завершено. Поэтому вы должны убедиться, что работа, которую вы выполняете в блоке, не слишком сильно налагает налог на систему.

, который, как я думаю, не относится к вам, но может применяться к другому лицу, добавившему несколько временных интервалов/границ.

 Смежные вопросы

  • Нет связанных вопросов^_^