写短视频项目的时候,优化后基本可以加载很快,并添加缓存策略,记录方便学习技术技巧知识,,项目结构点
1.结构采用UITableView来写的上下滑动;
2.加载视频播放策略;
3.缓存策略采用的是KTVHTTPCache;
4.播放响应优化注意点;
一、滑动架构:最核心的地方是控制 TableView的上下边距,上边距留够一个屏幕高度,下边距留够下滑3屏左右的缓冲.
实现滑动的代理方法:
1.首先需要声明一个当前滑动页码的成员变量
@property(nonatomic,assign)NSIntegercurrentIndex;
2.滑动代理停止的时候 判断一下
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
SVWeak;
dispatch_async(dispatch_get_main_queue(), ^{
//这里不能加任何操作,影响视频加载数组
CGPointtranslatedPoint = [scrollView.panGestureRecognizertranslationInView:scrollView];
scrollView.panGestureRecognizer.enabled = NO;
NSLog(@"UITableView禁止响应其他滑动手势");
if(translatedPoint.y< -50&&self.currentIndex< (self.svMutArr.count-1)) {
self.currentIndex++;
NSLog(@"向下滑动索引递增:%ld mutArr:%ld",self.currentIndex,self.svMutArr.count);
}
if(translatedPoint.y>50&&self.currentIndex>0) {
self.currentIndex--;
NSLog(@"向上滑动索引递减");
}
//防止View没刷新 页面闪退
[self.svTableView reloadData];
[UIView animateWithDuration:0.15 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
[weakSelf.svTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.currentIndex inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
}completion:^(BOOLfinished) {
scrollView.panGestureRecognizer.enabled = YES;
NSLog(@"UITableView可以响应其他滑动手势");
}];
});
}
50 实际上是你能允许滑动的最大触发区间
3.用KVO 来实现 页面变动驱动滑动的动画
[weakSelfaddObserver:self forKeyPath:@"currentIndex" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew context:nil];//skitV SVVideoYouControl
监听成员变量处理的事务
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
SVLog(@"observeValueForKeyPath:%@",keyPath)
if ([keyPath isEqualToString:@"currentIndex"]) {
//判断如果执行两次相同的,仅执行一次
SVSkitModel * svKit = self.svMutArr[self.currentIndex];
if ([svKit.sv_id isEqualToString:self.svDealOnce]) {
return;
}
self.svDealOnce= svKit.sv_id;
NSLog(@"indexPath发生改变:%ld svMutArr:%@",self.currentIndex,self.svMutArr);
dispatch_async(dispatch_get_main_queue(), ^{
SVVideoTableCell *cell = [self.self.svTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:self.currentIndex inSection:0]];
if(self.videoView) {
[self.videoViewremovePlayer];
[self.videoView removeFromSuperview];
}
}
}
二、加载视频播放策略
采用的是AVPlayer 加载视频,也有采用AVQueuePlayer队列播放策略,注意点
1.视频资源加密,如采用设置AVURLAsset的方法放在head头文件,如下代码:[headers setObject:@"skitVideo/1.0.0 (iPhone; iOS 16.4.1)"forKey:@"User-Agent"];
// 创建 AVURLAsset 来加载 URL
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:webVideoUrl options:@{@"AVURLAssetHTTPHeaderFieldsKey" : headers}];
// 创建 AVPlayerItem 来播放该资源
AVPlayerItem * playItemRe = [AVPlayerItem playerItemWithAsset:asset];
2.AVPlayerItem的preferredForwardBufferDuration 缓存加载时间如短视频1-3秒,长视频5-10秒,设置长导致加载慢
3.automaticallyWaitsToMinimizeStalling 为YES,YES 来减少启动延迟 自动播放
4.addPeriodicTimeObserverForInterval 设置timeObserver 进度显示block里面减少不必要的操作,影响播放效果
5.UITableViewCell 层和view层分开,UITableViewCell层处理点赞、屏幕等操作,view层只处理播放及效果的交互,懒加载方式
三、缓存策略采用的是KTVHTTPCache
具体实现NSURL *webVideoUrl = [KTVHTTPCache proxyURLWithOriginalURL:webVideoOrigin];,加载过的视频,可从缓存中提取
四.播放响应优化注意点;
借鉴的网址:https://www.sunyazhou.com/2018/11/AwemeTopBottomScrollDemo/