如何在Swift中使用AV Kit Player View Controller播放视频?
override func viewDidLoad() {
super.viewDidLoad()
let videoURLWithPath = "http://****/5.m3u8"
let videoURL = NSURL(string: videoURLWithPath)
playerViewController = AVPlayerViewController()
dispatch_async(dispatch_get_main_queue()) {
self.playerViewController?.player = AVPlayer.playerWithURL(videoURL) as AVPlayer
}
}
Run Code Online (Sandbox Code Playgroud) 到目前为止,我知道如何流式传输视频以及如何下载视频,然后将其流式传输,但这里有点棘手:将其流式传输一次,将其存储在设备上以及将来从设备中播放.
那可能吗?
我有一个显示图像和视频的iphone应用程序.应用程序结构的方式大多数图像和视频将保持不变,偶尔添加一个.我想对异步下载和缓存图像和视频的最佳和最简单的方法提出意见,以便即使在应用程序退出后它们仍会存在.另外,我只关心IOS 5及更高版本.
这是我到目前为止发现的一些信息,但我仍然不清楚最好的方法是什么,以及缓存是否会持久化.
SDWebImage(看起来很棒,但仅适用于图像)
这似乎是一个非常常见的用例,所以我真的在寻找最佳实践和/或示例代码的引用.
我有一些我在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];
Run Code Online (Sandbox Code Playgroud)
每次tableview使单元格出列,然后再次重新排队,再次从网址加载视频.我想知道是否有办法下载和缓存或保存视频,以便可以从手机播放而无需再次连接.我试图绘制由Apple提供的LazyTableImages示例中使用的技术,但我有点卡住了.
我正在尝试设置一个可以播放视频的UITableView。许多在此使用MPMoviePlayer(以前做题播放视频到UITableView的,在SWIFT播放视频的UITableView,播放视频从UITableView的),现在已不建议在iOS版9为数不多的以使用过AVFoundation(什么我使用),是这样的:当UITableViewCell完全可见并且是我从中获取大部分代码的地方时,播放视频。这是我的代码,位于cellForRowAtIndexPath内部:
VideoCell *videoCell = (VideoCell *)[self.tableView dequeueReusableCellWithIdentifier:@"VideoCell"];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
NSURL *url = [[NSURL alloc] initWithString:urlString];
dispatch_async(queue, ^{
videoCell.item = [AVPlayerItem playerItemWithURL:url];
dispatch_sync(dispatch_get_main_queue(), ^{
videoCell.player = [[AVPlayer alloc] initWithPlayerItem:videoCell.item];
videoCell.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:videoCell.player];
playerLayer.frame = CGRectMake(0, 0, videoCell.contentView.frame.size.width, videoCell.contentView.frame.size.height);
[videoCell.contentView.layer addSublayer:playerLayer];
playerLayer.videoGravity = AVLayerVideoGravityResize;
[videoCell.player play];
});
});
return videoCell;
Run Code Online (Sandbox Code Playgroud)
据我了解,在播放视频之前,我需要异步下载视频。我以前异步下载图像,其中的“下载”部分始终涉及转换NSURL-> NSData-> UIImage。然后,当您拥有UIImage时,就可以在单元格中显示它了,因此可以调出主队列和dispatch_async并执行单元格。在主队列上。
在这里,我有一个NSURL,但是我不太明白这里的哪些步骤应该在主队列中,哪些应该不在主线程中。我尝试了前面提到的SO问题中提出的建议,但到目前为止它没有用。表格单元格刚刚加载,视频从不播放。我只看到第一帧。有时它的前1秒会播放,但随后会缓冲,不会播放。我正在使用一个只有1个对象的表视图,因此只有1个视频要播放,但仍然没有播放。
我在做什么错,有人可以帮助我确切说明哪些部分需要在主线程上,哪些需要关闭?我在顶部提到的线程中的响应者说,“那里有很多教程”,但是在扫描google时我没有看到任何内容。“异步”和“ iOS”这两个词几乎总是会获得有关图片下载而非视频的搜索结果。但是,如果有任何教程,那么很高兴看到它。
谢谢
ios ×5
avfoundation ×2
caching ×2
uitableview ×2
video ×2
asynchronous ×1
avkit ×1
avplayer ×1
download ×1
ios4 ×1
iphone ×1
objective-c ×1
swift ×1