7

我在 UITableView 中显示了许多视频。视频远程存储在服务器上。我可以使用以下一些代码将视频加载到 tableview 中。

 NSString *urlString = [NSString stringWithFormat:[row objectForKey:@"video_uri"]];
 NSURL* url = [NSURL URLWithString:urlString];
 AVPlayerItem *pItem = [AVPlayerItem playerItemWithURL:url];
 AVPlayer *player = [AVPlayer playerWithPlayerItem:pItem];

每次 tableview 将单元​​格出列然后再次重新排队时,视频都会再次从 url 加载。我想知道是否有办法下载和缓存或保存视频,以便可以从手机播放而无需再次连接。我试图绘制苹果提供的LazyTableImages示例中使用的技术,但我有点卡住了。

4

3 回答 3

5

在尝试缓存 AVPlayerItems 失败后,我得出的结论是,如果缓存 AVPlayerItem 的底层 AVAsset 可以重用,而 AVPlayerItem 本身不打算重用,效果会更好。

于 2014-02-05T02:05:49.260 回答
2

有一种方法可以做到这一点,但它可能会对旧设备造成负担,随后导致您的应用程序被 MediaServerD 抛弃。

创建后,将每个玩家保存到 NSMutableArray 中。数组中的每个索引都应该对应 UITableView 的 indexPath.row。

于 2013-02-27T19:22:30.563 回答
0

昨天刚和朋友一起解决这个问题。我们使用的代码基本上使用了 NSURLSession 内置的缓存系统来保存视频数据。这里是:

    NSURLSession *session = [[KHURLSessionManager sharedInstance] session];
    NSURLRequest *req = [[NSURLRequest alloc] initWithURL:**YOUR_URL**];
    [[session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {


        // generate a temporary file URL

        NSString *filename = [[NSUUID UUID] UUIDString];

        NSURL *temporaryDirectoryURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES];
        NSURL *fileURL = [[temporaryDirectoryURL URLByAppendingPathComponent:filename] URLByAppendingPathExtension:@"mp4"];


        // save the NSData to that URL
        NSError *fileError;
        [data writeToURL:fileURL options:0 error:&fileError];


        // give player the video with that file URL
        AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:fileURL];
        AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
        _avMovieViewController.player = player;
        [_avMovieViewController.player play];



    }] resume];

其次,您需要为 NSURLSession 设置缓存配置。我的 KHURLSessionManager 使用以下代码处理此问题:

    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad;
    _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

最后,您应该确保您的缓存足够大以容纳文件,我将以下内容放在我的 AppDelegate 中。

     [NSURLCache sharedURLCache].diskCapacity = 1000 * 1024 * 1024; // 1000 MB

希望这可以帮助。

于 2016-02-12T19:59:34.987 回答