3

AVQueuePlayer を使用していくつかのビデオを再生していますが、iOS 6 および 7 ではすべて正常に動作します。ただし、iOS 8 では、現在の AVPlayerItem の再生が終了すると、次のビデオが再生されません。キューの currentItem プロパティにオブザーバーを配置すると、期待どおりキューが次のビデオを現在のアイテムとして設定していることが示されますが、再生されません (明示的な再生呼び出しがあっても)。

何が起こっているのか、それを修正する方法について何か洞察を持っている人はいますか? 他の誰かがこの問題に遭遇しましたか?

4

3 に答える 3

1

私はまったく同じ問題を抱えていて、これに10時間を無駄にしました...
しかし、メインスレッドに「insertItem」メソッドを追加することで修正されました。

だから私は自分のプレーヤーをプロパティとして持っています:

@property AVQueuePlayer * player;

私はこのようにそれを初期化します:

_player = [[AVQueuePlayer alloc] init];

そして、これがパスからアイテムを追加する私の方法です:

- (void)addInQueuePlayerFile:(NSString *)path {
   AVAsset * asset = [AVAsset assetWithURL:[[NSURL alloc] initFileURLWithPath:path]];
   AVPlayerItem * playerItem = [AVPlayerItem playerItemWithAsset:asset];

   dispatch_async(dispatch_get_main_queue(), ^{
      [_player insertItem:playerItem afterItem:nil];
   });
}

それでうまくいきましたが、その理由がよくわかりません...誰かが答えを持っていれば...

しかし、これがうまくいかない場合は、プレイヤー (および/または playerItem) にオブザーバーを追加してみてください。次のようなオブザーバーを追加できます。

[_player addObserver:self forKeyPath:@"status" options:0 context:nil]

そして、このメソッドでそれをキャッチします:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
   if (object == _player && [keyPath isEqualToString:@"status"]) {
      if (_player.status == AVPlayerStatusFailed) {
         NSLog(@"AVPlayer Failed");
      } else if (_player.status == AVPlayerStatusReadyToPlay) {
         NSLog(@"AVPlayer item Ready to Play");
      } else if (_player.status == AVPlayerStatusUnknown) {
         NSLog(@"AVPlayer item Unknown");
      }
   }
}

これがうまくいくかどうか教えてください。

于 2014-11-10T08:09:26.330 に答える
0

avplayer は、常にメイン スレッドでアクセスする必要があります。これは iOS8 にとって新しいことではありませんが、おそらく Apple がスレッドの使用方法を変更したため、iOS7 よりも頻繁に問題が発生しています。

再生状態の動的な変化が報告される可能性があるときにプレーヤーの非アトミック プロパティへの安全なアクセスを確保するには、レシーバーの通知キューでアクセスをシリアル化する必要があります。一般的なケースでは、このようなシリアル化は、メイン スレッドまたはキューで AVPlayer のさまざまなメソッドを呼び出すことによって自然に実現されます。

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVPlayer_Class/index.html

于 2014-11-18T01:19:28.927 に答える
0

私も同じ問題を抱えていました。数時間の試行の後、キュー内のアイテムのいくつかが異なる暗号化方法を使用している場合、プレーヤーが停止することがわかりました.

たとえば、プレーヤーが暗号化されたストリームの再生を終了したばかりで、キュー内の次のアイテムが暗号化されていない場合、プレーヤーは次のアイテムに移動しません。

于 2015-07-13T06:03:13.997 に答える