2016-11-09 2 views
1

Я хочу настроить AVPlayer скорость, я в состоянии сделать с помощьюсолонина воспроизведение с AVPlayer на Применив Rate больше чем 2x

[_avplayer play]; 
[_avplayer setRate:1.5]; 

Кроме инвалидов звуковых дорожек, она работает хорошо, когда он меньше, чем 2,0. Но когда мы применяем его больше 2X, это приводит к Чоппи или резкое видео.

Когда я гугл об этом - я нашел эту одну ссылку предлагая такой же поведение

https://developer.apple.com/library/content/qa/qa1772/_index.html

Воспроизведения со скоростью более 2,0 может привести к вяленому или порывистому воспроизведению, когда скорость передачи данных или другие требования к обработке , играя с указанной скоростью, превышает способность AVFoundation до не отставать. В этих случаях AVPlayer автоматически ухудшает качество воспроизведения для того, чтобы идти в ногу с использованием стратегий возврата в зависимости от преобладающих условий. Один уровень деградации предназначен для декодирования и отображения только I-кадров в видеопотоке, и это действительно может показаться изменчивым.

Может ли кто-нибудь помочь, если это так, чем какой подход я должен использовать для достижения того же?

ответ

6

Как @ Rhythmic предложил, чтобы эти способы могли быть реализованы, но все это вроде хлопот. Я искал его больше и нашел способ, и он работает очень хорошо, не рывком или изменчивым.

Только не устанавливайте скорость, установите Оценить как этот. Сначала создайте экземпляр AVPlayer, AVPlayerItem и AVAsset.

AVMutableComposition *composition = [AVMutableComposition composition]; 
     NSError *error = nil; 
     [composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
          ofAsset:asset 
           atTime:kCMTimeZero error:&error]; 
     [composition scaleTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
         toDuration:CMTimeMultiplyByFloat64(asset.duration, 1/rate)]; 
     AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:composition]; 
     self.avRefPlayer = [AVPlayer playerWithPlayerItem:playerItem]; 

     self.avRefPlayerLayer = [AVPlayerLayer layer]; 

     [self.avRefPlayerLayer setPlayer:self.avRefPlayer]; 
     [self.avRefPlayerLayer setFrame:_refrencedView.bounds]; 
     [self.avRefPlayerLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 

этот код может поддерживать даже более чем 2x или 4x скорость.

+1

Magic! Как это работает? Я впечатлен. –

+1

FWIW, два приложения, которые я создал - один в Objective-C, а другой в Swift - обе демонстрируют эту проблему. Стоит отметить, что проблема не в медиа-файле: Quicktime Player, например, не имеет проблем с воспроизведением его очень быстро, в то время как мои приложения не могут показаться более чем около 1,5x. Я только что реализовал выше в Swift и обнаружил, что он работает. Я могу воспроизвести, например, 9x, без проблем. – Jamborino

+1

Это отлично работает. Однако событие, изменяя изменения масштаба времени и делая правильные искажения, изменение скорости во время воспроизведения видео по-прежнему очень сложно получить прямо без фантастических скачков кадра. Поскольку структура, очевидно, способна играть быстрыми темпами, я до сих пор не понимаю, пока свойство 'rate' не поддерживает его ... – deadbeef

1

Вы можете попробовать несколько вещей:

  1. ниже частота кадров видео
  2. добавить больше I-кадров для видео (это может быть немного извращенное, учитывая QA-1772's advice)
  3. декодированием (или лучше? кодировать) видео с более низким разрешением
  4. ниже битрейт видео
  5. меры, как гораздо быстрее, чем в реальном времени AVAssetReader может декодировать в & замените AVPlayer на свой собственный маршрут Metal + AVAssetReader, если вы считаете, что некоторые характеристики потеряны при транспортировке. Не забудьте также рассмотреть звук, если вы пройдете этот путь.
0

Это похоже на ошибку в AVFoundation. Это может играть плавно при быстрых тарифах для многих видеороликов, где в большинстве случаев это не так. Например, можно использовать стиль плавающего контроллера AVPlayerView, чтобы открыть кнопку быстрой перемотки вперед. Нажатие этой кнопки несколько раз приводит к плавному, быстрому воспроизведению, где просто установка AVPlayer.rate этого не делает.

В ответе на вопрос this question Я объясняю обходной путь для этой проблемы.

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