Lecture saccadée à partir d'un lecteur sur le taux d'application supérieur à 2x

Je veux ajuster le taux Avplayer, je peux faire avec l'aide de

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

Également désactivé les pistes audio, il fonctionne bien lorsqu'il est inférieur à 2.0. Mais lorsque nous l'appliquons plus de 2X, il en résulte une video Choppy ou saccadée.

Quand j'ai recherché sur Google – j'ai trouvé ce lien qui suggère le même comportement

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

Jouer à des fréquences supérieures à 2.0 peut entraîner une lecture saccadée ou saccadée lorsque le débit de données ou d'autres exigences de traitement à la fréquence spécifiée dépasse la capacité de AVFoundation à suivre. Dans ces cas, AVPlayer dégrade automatiquement la qualité de la lecture afin de suivre le rythme, en utilisant un niveau de stratégies de repli en fonction des conditions en vigueur. Un niveau de dégradation consiste à décoder et n'afficher que les images I dans le sous-stream video, ce qui peut en effet sembler être saccadé.

Quelqu'un peut-il aider comme si c'est le cas, quelle approche dois-je utiliser pour atteindre le même?

Comme @ Rhythmic a suggéré ces moyens peuvent être mis en œuvre, mais tout cela est une sorte de tracas. Je l'ai googlé plus et trouvé un moyen et il fonctionne très bien sans secousse ni saccadée.

Il suffit de ne pas définir le débit, réglez le taux comme ceci. Créez d'abord une instance de AVPlayer, AVPlayerItem et 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]; 

ce code peut même supporter plus de 2x ou 4x vitesse facilement.

Vous pourriez essayer quelques choses:

  1. abaisser le framerate de votre video
  2. append plus de I-frames à votre video (ceci peut être légèrement pervers, count tenu des conseils du QA-1772 )
  3. décoder (ou mieux encoder) la video à une résolution plus faible
  4. abaisser le débit de la video
  5. mesurez la vitesse à laquelle AVAssetReader peut être AVAssetReader time réel et remplacez AVPlayer par votre propre path Metal + AVAssetReader si vous pensez que certaines performances ont été perdues pendant le transport. Ne pas oublier de considérer l'audio, aussi, si vous prenez ce path.

Cela semble être un bug dans AVFoundation. Il peut jouer en douceur à des tarifs rapides pour de nombreuses videos où, dans la plupart des circonstances, il ne fonctionne pas. Par exemple, on peut utiliser le style de controller flottant d'AVPlayerView pour exposer un button d'avance rapide. Si vous cliquez plusieurs fois sur ce button, la lecture est fluide et rapide, ce AVPlayer.rate n'est pas le cas pour AVPlayer.rate .

Dans ma réponse à cette question, j'explique une solution de contournement pour ce problème.