Playing Video into UITableView

前端 未结 3 1518
别那么骄傲
别那么骄傲 2020-12-08 17:32

I have read several posts here about live streaming video/audio. Unfortunately it seems that there is not any \"good\" solution.

I want same functionali

相关标签:
3条回答
  • 2020-12-08 17:47

    When you scroll table view then method -tableView:cellForRowAtIndexPath: is fired (actually every time when cell will be visible this method is called). I believe that you are allocating and initializing yours MediaPlayer in this method and that's why video is downloaded again. You could try to add array and store already created cells in it (some kind of cache). Then your -tableView:cellForRowAtIndexPath should check if it has sth cached for actual index. If yes then show cached cell. If no then it should create cell, alloc, and init player and then store cell in cache.

    My ViewController has property: NSMutableDictionary *cache; and in ViewDidLoad I have: cache = [[NSMutableDictionary alloc] init]; My -tableView:cellForRowAtIndexPath: looks like this:

    - (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; 
    }
    

    It works for me. Of course you need to use your own datasource etc.

    0 讨论(0)
  • 2020-12-08 17:51

    Don't use MPMoviePlayerController, use AVFoundation's AVPlayer.

    Additionally, don't couple the downloading of your asset to your UITableViewCell subclass. Use an additional data source to download and manage the video assets.

    There are a few ways you can do this.

    1. Keep a data source array of AVPlayerItem objects initialized by URL. Instead of loading the asset each time you scroll to a cell, just load the AVPlayerItem into the cell's player, and remove it when you scroll away.

    2. If you need to persist the video data, consider downloading each video to a temporary file in your Documents directory. When the file has finished downloading, load that data into an AVAsset using its initWithURL: method and point the URL to your local file. When ready, you can load your asset into an AVPlayerItem using initWithAsset: and play the video.

    0 讨论(0)
  • 2020-12-08 18:04

    Swift 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
    }
    
    0 讨论(0)
提交回复
热议问题