10

ライブストリーミングvideo/audioについていくつかの記事を読んでいます。残念ながら、「良い」解決策はないようです。ビデオをUITableViewに再生する

ビデオ用に同じ機能が必要です(画像はSDWebImageView)。

今、私は次のコードを使用しています: -

NSURL *url=[[NSURL alloc] initWithString:@"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"]; 
MPMoviePlayerController *moviePlayer=[[MPMoviePlayerController alloc] initWithContentURL:url]; 
moviePlayer.controlStyle=MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay=YES; 

をしかし、私はtableviewをスクロールしたときに、すべてのビデオは、再びダウンロードして、再び。だからどのように私はそのをダウンロードすることを停止することができますか?

UITableViewに動画を再生する方法はありますか?同じさんはFacebook、Instagram、Vine Appsを行っていますか?

+3

MPMoviePlayerControllerとMPMoviePlayerViewControllerは以降のiOS 9ので推奨されていません。他のプレーヤーコントローラーを使用する必要があります。 https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerController_Class/およびhttps://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerViewController_class/index.htmlを参照してください。 #// apple_ref/occ/cl/MPMoviePlayerViewController – Skywalker

+0

Ok。次に、AVPlayerViewControllerを使用します。しかし、私の問題は、どのように私はそれを停止し、再びそのビデオをtableviewのためにダウンロードすることができます.. –

+1

私はこの答えが役立つと思う.http://stackoverflow.com/a/14961854/5316422 – Skywalker

答えて

7

テーブルビューをスクロールすると、メソッド-tableView:cellForRowAtIndexPath:が発生します(実際には、セルが表示されるたびにこのメソッドが呼び出されます)。この方法でMediaPlayerを割り当てて初期化しているので、ビデオが再びダウンロードされるのは私が信じています。配列を追加して、既に作成されたセルをその中に保存しようとすることもできます(ある種のキャッシュ)。次に、-tableView:cellForRowAtIndexPathは、実際のインデックス用にキャッシュされているかどうかをチェックする必要があります。はいの場合は、キャッシュされたセルを表示します。いいえの場合は、cell、alloc、init playerを作成し、セルをキャッシュに格納する必要があります。 NSMutableDictionary *cache;をしてViewDidLoadに私が持っている::

私のViewControllerは、プロパティを持っていcache = [[NSMutableDictionary alloc] init];-tableView:cellForRowAtIndexPath:は、次のようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellId = @"myCellId"; 

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; 

    if ([cache objectForKey:[NSString stringWithFormat:@"key%lu", indexPath.row]] != nil) { 
     cell = [cache objectForKey:[NSString stringWithFormat:@"key%lu", indexPath.row]]; 
    } else { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 

     AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init]; 
     playerViewController.player = [AVPlayer playerWithURL:[[NSURL alloc] initWithString:@"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"]]; 
     [cell addSubview:playerViewController.view]; 
     [cache setValue:cell forKey:[NSString stringWithFormat:@"key%lu", indexPath.row]]; 
    } 

    return cell; 
} 

それは私のために動作します。もちろん、独自のデータソースなどを使用する必要があります。

+1

私はすでにこれを試してみました。しかし、私が望むように働いていない..これのためのサンプルコードがあれば、提供してください。私のために良い...質問の@Meharoof Najeebのコメントを確認してください。 –

+0

@MeetDoshiあなたが望むサンプルコードを追加しました – owocki

+0

ありがとう!!それは良いと思う。正直、その偉大な論理。 –

9

MPMoviePlayerControllerを使用しないでください。AVFoundationAVPlayerを使用してください。

さらに、アセットのダウンロードをUITableViewCellサブクラスに結合しないでください。追加のデータソースを使用して、ビデオアセットをダウンロードして管理します。

これを行う方法はいくつかあります。

  1. AVPlayerItemオブジェクトをURLで初期化してください。セルにスクロールするたびにアセットを読み込むのではなく、セルのプレーヤーにAVPlayerItemをロードして、スクロールするときにそれを削除するだけです。

  2. ビデオデータを永続化する必要がある場合は、各ビデオをドキュメントディレクトリの一時ファイルにダウンロードすることを検討してください。ファイルのダウンロードが完了したら、そのデータをinitWithURL:メソッドを使用してAVAssetにロードし、URLをローカルファイルに指定します。準備ができたら、initWithAsset:を使用してAVPlayerItemにアセットを読み込み、動画を再生できます。

+0

ビデオを一時停止したい場合、ユーザーがスクロールしてもう一度再生すると、ポイント1で終了できます。 –

+0

ビデオをダウンロードするコードを提供できますか。 –

+0

セルでビデオを自動再生することができる第三者フレームワークはありますか? –

2

スウィフト3

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell")! 
    let videoURL = NSURL(string: "http://www.ebookfrenzy.com/ios_book/movie/movie.mov") 
    let player = AVPlayer(url: videoURL! as URL) 
    let playerLayer = AVPlayerLayer(player: player) 
    playerLayer.frame = cell.bounds 
    cell.layer.addSublayer(playerLayer) 
    player.play() 
    return cell 
} 
関連する問題