2015-05-20 1 views
8

AVPlayer имеет свойство rate, предназначенное для управления скоростью воспроизведения. 1.0 - нормальная скорость, тогда как значения, такие как 2.0 или 5.0, должны воспроизводиться на 2x и 5x соответственно.Как вы получаете плавное высокоскоростное воспроизведение с AVPlayer?

Когда я устанавливаю значение скорости воспроизведения выше 1.0 (скажем 10.0), воспроизведение очень прерывистое, и похоже, что большое количество кадров падает, поскольку игрок не может идти в ногу с ним.

Однако те же значения в QuickTime Player (с тем же фильмом) обеспечивают плавное воспроизведение для ставок 2x, 5x, 10x, 30x and 60x (как сообщает QuickTime Player).

Я создал тестовое приложение OS X, которое содержит не более AVPlayerView и две кнопки для установки скорости воспроизведения. Скорость 1.0 работает так, как ожидалось, но скорость 10.0 производит очень прерывистое воспроизведение.

Однако AVPlayerView имеет нечетное странность в том, что если вы щелчок мыши на шкале времени воспроизведения, чтобы искать в другое место (в то время как он играет на 10x и изменчивый), то AVPlayerView будет «исправить» воспроизведение и кино будет воспроизводиться гладко в 10 раз. Все, что нужно, это щелкнуть на временной шкале воспроизведения.

Кто-нибудь знает, как добиться плавного воспроизведения ставок, отличных от 1x? Это, очевидно, не проблема с аппаратным обеспечением или проблема с размером файла, так как QuickTime Player и AVPlayerView могут это сделать.

Попытка

Это question предполагает, что это может быть аудио вопроса (и на самом деле, как QuickTime Player и AVPlayerView отключения звука при переадресации), но все попытки с моей стороны либо отключить все звуковые дорожки, немым все треков или изменения алгоритма звукового тона, похоже, не повлияли. Воспроизведение было еще изменчивым, даже когда не было звука.

Я также попытался остановить воспроизведение, а затем вызвал prerollAtRate:completionHandler с новой скоростью, но это тоже не имеет значения.

Что делает QuickTime Player и AVPlayerView, что обеспечивает плавное воспроизведение фильмов со скоростью 10x, 30x или даже 60x?

+1

ли вы найти решение этой проблемы? Если да, то что это было? –

+0

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

+0

Под MacOS 10.12.3/Xcode 8.2.1, я подтвердил некоторые из перечисленных выше: скорость до 2.0 не проблема, но установка 'AVPlayer.rate' значения более 2.0 вызывает прерывистое воспроизведение; использование AVPlayerView для изменения скорости воспроизведения приводит к плавному воспроизведению на всех скоростях; устанавливая скорость сначала до 0.0, а затем вызывая 'prerollAtRate (atRate :, completHandler:)' и устанавливая высокий уровень в обработчике завершения, не решает проблему; создание AVMutableComposition только с видеодорожкой не решает проблему; отключение звуковой дорожки не решит проблему. – Jamborino

ответ

0

Это только обходное решение.

Когда скорость воспроизведения изменяется с 0.0 на большое значение, если это первый переход от нуля к ненулевому с частотой воспроизведения с момента последнего вызова до AVPlayer.replaceCurrentItem, воспроизведение является плавным (и звук автоматически отключается). Необходимо, чтобы это был первый такой переход: просто установка скорости 0.0 сначала, а затем до нужной скорости не работает.

Так, к примеру, это будет производить плавное воспроизведение на высоких скоростях:

func setPlayerRate(player: AVPlayer, rate: Float) { 
    // AVFoundation wants us to do most things on the main queue. 
    DispatchQueue.main.async { 
     if (rate == player.rate) { 
      return 
     } 
     if (rate > 2.0 || rate < -2.0) { 
      let playerItem = player.currentItem 
      player.replaceCurrentItem(with: nil) 
      player.replaceCurrentItem(with: playerItem) 
      player.rate = rate 
     } else { 
      // No problems "out of the box" with rates in the range [-2.0,2.0]. 
      player.rate = rate 
     } 
    } 
} 
+0

Переключение AVPlayerItem или перемотки дорожек в режиме AVComposition являются действительными, если не тяжелыми, способами получения более плавного воспроизведения. Однако они не являются отличными решениями, если вы хотите, чтобы пользователь мог изменять скорость воспроизведения во время воспроизведения в реальном времени. Такое поведение является обычным явлением в видеоприложениях, которые имеют циферблат «jog». В интроспекции QuickTime Player предлагается (хотя и не подтверждено), что для некоторых скоростей воспроизведения он совершает повторные вызовы 'seekTime ... ', вероятно, сработал с пользовательского timeBase и, возможно, выполнил некоторые обходы декодирования/кэширования для лучшей производительности. – kennyc

+0

... И с легкостью изменение скорости воспроизведения - это то, что я хотел бы сделать! Теперь, когда вы упомянули об этом, я также создал то, что показывает предварительные просмотры фильмов так же, как Final Cut Pro X, где, когда вы наводите на них курсор, ячейки на листе миниатюр показывают видео. Я чувствовал разочарование в том, что он работает так хорошо, даже когда он бросает мышь, и это не так. Я просто не был достаточно умен, чтобы думать о применении seekTime таким образом. Благодаря! Я попробую. Это также обойдутся ошибкой, что некоторые уведомления пропадут при воспроизведении с высокой скоростью. – Jamborino

+0

Для небольшого видеоизображения, которое пользователь может прочистить, просто перемещая мышь по нему, вы, вероятно, получите более чем адекватную производительность, играя со временем, когда вы ищите, и допустимый допуск. Декодирование почти мгновенно, если вы ищете «ключевой кадр», а не произвольное время. Поскольку точность времени не очень важна при предварительном просмотре видео, вы можете подумать о том, чтобы массировать время, в которое вы стремитесь, чтобы оно попадало или было очень близко к ключевому кадру. Дополнительную информацию об использовании 'AVSampleCursor' для определения ключевых кадров см. В TechNote' TN2404'. – kennyc

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

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