16

AVQueuePlayer を使用して、プロジェクトのさまざまな章にスライスされたテレビ番組を再生しています。また、AVQueuePlayer が既に再生されている間に、前/次のチャプターにスキップしたり、その場で別のチャプターを選択したりできるようにしたいと考えています。

advanceToNextItemAVQueuePlayer が提供する次のアイテムへのスキップは問題ありませんが、キューから特定のアイテムをスキップしたり再生したりすることは同じではありません。

したがって、ここで何が最善のアプローチになるかはよくわかりません。

  1. AVQueuePlayer の代わりに AVPlayer を使用して、nextItemを再生するためreplaceCurrentItemWithPlayerItem:に atを呼び出し、 actionAtItemEnd'replaceCurrentItemWithPlayerItem' を使用して、ユーザーが特定のチャプターを選択できるようにします。

また

  1. 「insertItem:afterItem:」および「removeAllItems」を使用して、キューまたは現在のプレーヤーを再編成します

追加情報: さまざまなビデオへのパスを、NSArray に表示される順序で保存します。ユーザーは、チャプターを表すボタンを押すことで、特定のチャプターにジャンプすることになっています。ボタンには、配列内の対応するビデオのインデックスでもあるタグがあります。

私は自分自身を明確にすることができますか?この状況を経験した人はいますか?機能を提供する優れた IOS VideoPlayerFramework をどこで購入できるかを誰かが知っている場合は、リンクもいただければ幸いです。

4

8 に答える 8

23

プログラムで前のアイテムを再生し、playeritems(NSArray)から選択したアイテムを再生できるようにする場合は、これを行うことができます。

- (void)playAtIndex:(NSInteger)index
{
    [player removeAllItems];
    for (int i = index; i <playerItems.count; i ++) {
        AVPlayerItem* obj = [playerItems objectAtIndex:i];
        if ([player canInsertItem:obj afterItem:nil]) {
        [obj seekToTime:kCMTimeZero];
        [player insertItem:obj afterItem:nil];
        }
    }
}

編集:playerItemsは、AVPlayerItemsを格納するNSMutableArray(NSArray)です。

于 2012-08-31T05:49:16.917 に答える
3

最初の答えは、AVQueuePlayer からすべてのアイテムを削除し、インデックス引数として渡された反復から始まるキューを再作成します。これにより、前のアイテム (正しいインデックスを渡したと仮定) で新しく設定されたキューが開始され、その時点から既存の playerItems 配列内の残りのアイテムが開始されますが、複数のリバースは許可されません。たとえば、トラック 10 にいて、戻ってトラック 9 を再生し、次にトラック 5 を再生すると、上記では達成できません。しかし、ここでできる...

-(IBAction) prevSongTapped: (id) sender
{
    if (globalSongCount>1){ //keep running tally of items already played
    [self resetAVQueue]; //removes all items from AVQueuePlayer

        for (int i = 1; i < globalSongCount-1; i++){
            [audioQueuePlayer advanceToNextItem];
        }
   globalSongCount--;
   [audioQueuePlayer play];


    }
}
于 2012-10-11T08:59:07.753 に答える
2

次のコードを使用すると、. プレーヤーヘッドの進行はありません。簡潔でシンプル。playerItemList は、AVPlayerItem オブジェクトを含む NSArray です。

- (void)playAtIndex:(NSInteger)index
{
    [audioPlayer removeAllItems];
    AVPlayerItem* obj = [playerItemList objectAtIndex:index];
    [obj seekToTime:kCMTimeZero];
    [audioPlayer insertItem:obj afterItem:nil];
    [audioPlayer play];
}
于 2013-06-10T13:20:35.280 に答える
2

djiovannAVQueuePlayerは、まさにこの機能を提供する のサブクラスを作成しました。

githubで見つけることができます。

まだテストしていませんが、コードをブラウジングすると、仕事がうまくいくようです。また、コードは十分に文書化されているため、少なくとも機能のカスタム実装の良いリファレンスとして役立つはずです (ただし、サブクラス化の代わりにカテゴリを使用することをお勧めします)。

于 2014-03-11T11:25:53.447 に答える
0

AVQueuePlayer.Then を使用して任意のインデックスから曲を再生する場合は、次のコードが役立ちます。

NSMutableArray *musicListarray (add song that you want to play in queue);
AVQueuePlayer *audioPlayer;
AVPlayerItem *item;

-(void) nextTapped
{
  nowPlayingIndex = nowPlayingIndex + 1;

  if (nowPlayingIndex > musicListarray.count)
  {
  }
  else
  {
    [self playTrack];
  }
}

-(void) playback
{
  if (nowPlayingIndex < 0)
  {
  }
  else
  {
    nowPlayingIndex = nowPlayingIndex - 1;
    [self playTrack];
  }
}

-(void) playTrack
{
  @try
  {
    if (musicArray.count > 0)
    {
      item =[[AVPlayerItem alloc] initWithURL: [NSURL URLWithString:musicListarray
      [nowPlayingIndex]]];
      [audioPlayer replaceCurrentItemWithPlayerItem:item];
      [audioPlayer play];
    }
  }
  @catch (NSException *exception)
  {
  }
}

-(void) PlaySongAtIndex
{
  //yore code...
  nowPlayingIndex = i (stating index from queue)[audioPlayer play];
  [self playTrack];
}

ここで、曲を再生したいときに PlaySongAtIndex を呼び出します。

于 2016-12-17T05:33:39.963 に答える