2013-07-26 3 views
4

Я играю в прямом эфире в приложении iOS, которое я разрабатываю. Я использую MPMoviePlayerController и вам необходимо создать настраиваемые элементы управления (воспроизведение, пауза, индикатор выполнения и т. Д.).MPMoviePlayerController: получение надежного non-skipping currentPlaybackTime

При попытке получить currentPlaybackTime я замечаю очень странное поведение: он проскакивает, как будто нет завтра.

Долгосрочное свойство стабильно в 7170 секунд, оно никогда не изменяется. Свойство playableDuration растет во время воспроизведения фильма, и currentPlaybackTime постоянно прыгает вокруг:

playableDuration: 7179.875398 
currentPlaybackTime: 7170.181204 
-------------- 
playableDuration: 7187.655396 
currentPlaybackTime: 7171.079373 
-------------- 
playableDuration: 7197.208128 
currentPlaybackTime: 7172.131998 
-------------- 
playableDuration: 7197.208128 
currentPlaybackTime: 7173.139118 
-------------- 
playableDuration: 7197.208128 
currentPlaybackTime: 7174.139770 
-------------- 
playableDuration: 7197.208128 
currentPlaybackTime: 7175.139666 
-------------- 
playableDuration: 7197.208128 
currentPlaybackTime: 7176.140805 
-------------- 
playableDuration: 7197.208128 
currentPlaybackTime: 7177.139057 
-------------- 
playableDuration: 7197.208128 
currentPlaybackTime: 7178.139128 
-------------- 
playableDuration: 7197.208128 
currentPlaybackTime: 7179.139911 
-------------- 
playableDuration: 7199.822063 
currentPlaybackTime: 7170.095921 
-------------- 
playableDuration: 7209.959997 
currentPlaybackTime: 7171.140078 
-------------- 
playableDuration: 7209.959997 
currentPlaybackTime: 7172.140715 
-------------- 
playableDuration: 7209.959997 
currentPlaybackTime: 7173.076899 
-------------- 
playableDuration: 7209.959997 
currentPlaybackTime: 7174.139497 
-------------- 
playableDuration: 7209.959997 
currentPlaybackTime: 7175.139907 
-------------- 
playableDuration: 7209.959997 
currentPlaybackTime: 7176.138233 
-------------- 
playableDuration: 7209.959997 
currentPlaybackTime: 7177.139523 
-------------- 
playableDuration: 7209.959997 
currentPlaybackTime: 7178.135736 
-------------- 
playableDuration: 7209.959997 
currentPlaybackTime: 7179.138545 
-------------- 
playableDuration: 7209.959997 
currentPlaybackTime: 7180.111102 
-------------- 
playableDuration: 7219.939398 
currentPlaybackTime: 7171.132859 
-------------- 
playableDuration: 7219.939398 
currentPlaybackTime: 7172.128591 
-------------- 
playableDuration: 7219.939398 
currentPlaybackTime: 7173.136137 
-------------- 
playableDuration: 7219.939398 
currentPlaybackTime: 7174.135416 
-------------- 
playableDuration: 7219.939398 
currentPlaybackTime: 7175.137593 
-------------- 
playableDuration: 7219.939398 
currentPlaybackTime: 7176.131573 
-------------- 
playableDuration: 7219.939398 
currentPlaybackTime: 7177.137812 
-------------- 
playableDuration: 7219.939398 
currentPlaybackTime: 7178.131751 
-------------- 
playableDuration: 7219.939398 
currentPlaybackTime: 7179.135922 
-------------- 
playableDuration: 7219.939398 
currentPlaybackTime: 7180.139828 
-------------- 
playableDuration: 7229.752731 
currentPlaybackTime: 7171.129731 
-------------- 
playableDuration: 7229.752731 
currentPlaybackTime: 7172.136576 
-------------- 
playableDuration: 7229.752731 
currentPlaybackTime: 7173.132362 
-------------- 
playableDuration: 7229.752731 
currentPlaybackTime: 7174.139998 

Как вы можете видеть, что прыжки с 7179 до 7170, а затем с 7180 обратно в 7171, и снова и снова ... В другими словами, похоже, нет никакого способа получить стабильный инкремент currentPlaybackTime. Это заставляет мой индикатор прогресса прыгать, а метка прогресса (0:04:30/2:00:00) ведет себя очень странно.

Кто-нибудь видел это поведение? Есть ли обходной путь?

+0

Я на самом деле вижу то же самое поведение с собственным MPMoviePlayerViewController. Истекшее время возвращается каждые 10 секунд. Я предполагаю, что я ничего не могу с этим поделать. –

+0

Это звучит как неправильно закодированные данные - очень внимательно проверяйте поток фильмов и его кодировку. – Till

+0

У меня такая же проблема: я называю «setCurrentPlaybackTime», тогда я получаю «currentPlaybackTime», как я его устанавливал, затем он возвращается к предыдущему значению. Это так раздражает поведение. Удивительно, что Apple не решила эту проблему должным образом. – bashan

ответ

0

В конце концов я решил эту проблему, используя свое собственное внутреннее свойство, чтобы следить за время воспроизведения:

@property (nonatomic) NSTimeInterval previousPlaybackTime; 
@property (nonatomic) NSTimeInterval currentPlaybackTime; 
@property (strong, nonatomic) NSTimer *timer; 

- (void)setCurrentPlaybackTime:(NSTimeInterval)currentPlaybackTime { 
    BOOL force = (self.moviePlayer.playbackState == MPMoviePlaybackStatePaused); 
    [self setCurrentPlaybackTime:currentPlaybackTime force:force]; 
} 

- (void)setCurrentPlaybackTime:(NSTimeInterval)currentPlaybackTime force:(BOOL)force { 
    if (currentPlaybackTime > self.moviePlayer.duration) { 
     currentPlaybackTime = self.moviePlayer.duration; 
    } 

    if (!force && currentPlaybackTime < _previousPlaybackTime) { 
     // Don't go backwards in time if it's less then 50 seconds (solves the 10 seconds going back problem) 
     if (_previousPlaybackTime - currentPlaybackTime < 50) { 
      return; 
     } 
    } 

    if (!force && _previousPlaybackTime && currentPlaybackTime > _previousPlaybackTime) { 
     // Don't go forward in time if it's more then 10 seconds (solves the huge jumps when using the progress bar) 
     if (currentPlaybackTime - _previousPlaybackTime > 10) { 
      return; 
     } 
    } 

    _previousPlaybackTime = currentPlaybackTime; 
    _currentPlaybackTime = currentPlaybackTime; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timedJob) userInfo:nil repeats:YES]; 
    [self.timer fire]; 
} 

- (void)timedJob { 
    if (self.moviePlayer.playbackState == MPMoviePlaybackStateSeekingBackward) return; 
    if (self.moviePlayer.playbackState == MPMoviePlaybackStateSeekingForward) return; 

    self.currentPlaybackTime = self.moviePlayer.currentPlaybackTime; 
} 

Так что в моем интерфейсе я теперь использовать self.currentPlaybackTime, который имеет защиту от скачка, построенной в , так сказать. Когда пользователь использует ползунок для изменения позиции воспроизведения, вы используете параметр force: YES.

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