好久没写文章了,最近有点时间,模仿了一个抖音视频上下滑动切换播放功能,顾记录下实现方案,共勉。
一、先说下大致思路:
1.UITableView : Cell上展示视频第一帧图片,点赞,评论,头像等参数
2.封装一个视频播放View
3.定义一个属性currentIndex,并添加他的观察属性,当currentIndex属性值改变时,处理视频播放功能
4.UITableView滑动代理,处理视频上下滑动动画操作
5.注意,整个UITableView中,只存在一个视频播放实例方法,这样性能提升
直播功能的界面展示,也同样处理逻辑
开始之前,info.plist 需要增加麦克风,相册权限
因为是demo,所有代码怎么简单怎么来,谅解!!!
下面是具体代码,供参考,自己直接copy到项目中就可以用,如有需要再讲代码上传都codding
涉及图片资源,自己随便找个图顶下就行
欢迎关注公众号:编程大鑫,进群大家一起交流进步!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bi9YqM5B-1627022506398)(//upload-images.jianshu.io/upload_images/2151291-109c6326a56f2eaa.png?imageMogr2/auto-orient/strip|imageView2/2/w/722/format/webp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DH4vadJr-1627022506399)(//upload-images.jianshu.io/upload_images/2151291-699b477a4032ba83.png?imageMogr2/auto-orient/strip|imageView2/2/w/722/format/webp)]
二、代码实现
1,HomeController.h类中
#import "HomeController.h"
#import "VideoTableCell.h" //自定义Cell
#import "VideoView.h"
//位置:松开后切换视频
#define offsetY 100
@interface HomeController ()<UITableViewDataSource,UITableViewDelegate>{
UITableView * table;
NSArray * dataArray; //存放视频url
NSMutableArray * videoPicArray;//视频第一帧图片,真实情况下后台会返回图片第一帧url
}
@property(nonatomic,strong)VideoView * videoView;//视频播放器
@property(nonatomic,assign)NSInteger currentIndex;//当前tableview indexPath
@end
@implementation HomeController
- (void)viewDidLoad {
[super viewDidLoad];
[self initData];
[self setupView];
//获取视频第一帧
dispatch_async(dispatch_get_global_queue(0,0), ^{
for (int i = 0; i < self->dataArray.count;i++) {
UIImage * image = [self getVideoPreViewImage:[NSURL URLWithString:self->dataArray[i]]];
[self->videoPicArray replaceObjectAtIndex:i withObject:image];
dispatch_async(dispatch_get_main_queue(), ^{
[self->table reloadData];
});
}
});
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//进入界面时,播放
if(self.videoView){
[self.videoView play];
}
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
//离开时暂停播放
if(self.videoView){
[self.videoView pause];
}
}
-(void)initData{
dataArray=@[
@"https://aweme.snssdk.com/aweme/v1/play/?video_id=ba8f4ff0c1fe445dbfdc1cc9565222fa&line=0&ratio=720p&media_type=4&vr_type=0&test_cdn=None&improve_bitrate=0",
@"http://ctgdev.oss-cn-shanghai.aliyuncs.com/zys/04795f79-697b-4647-958b-fed0261b2730.mp4",
@"https://aweme.snssdk.com/aweme/v1/play/?video_id=ba8f4ff0c1fe445dbfdc1cc9565222fa&line=0&ratio=720p&media_type=4&vr_type=0&test_cdn=None&improve_bitrate=0",
@"http://ctgdev.oss-cn-shanghai.aliyuncs.com/zys/04795f79-697b-4647-958b-fed0261b2730.mp4",
@"https://aweme.snssdk.com/aweme/v1/play/?video_id=ba8f4ff0c1fe445dbfdc1cc9565222fa&line=0&ratio=720p&media_type=4&vr_type=0&test_cdn=None&improve_bitrate=0"];
videoPicArray=[NSMutableArray array];
for(int i=0;i<dataArray.count;i++){
[videoPicArray addObject:[UIImage imageNamed:@"img_video_loading"]];
}
}
-(void)setupView{
navView.backgroundColor=MS_RGBA(0, 0, 0, 0);
UILabel * liveLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, StatusHeight+10, 60, 20)];
liveLabel.text=@"直播";
liveLabel.font=[UIFont boldSystemFontOfSize:16];
liveLabel.textAlignment=NSTextAlignmentCenter;
liveLabel.textColor=[UIColor whiteColor];
[navView addSubview:liveLabel];
CGFloat leftX = (SCREEN_WIDTH-150)/3;
UILabel * locationLabel = [[UILabel alloc] initWithFrame:CGRectMake(leftX+50, StatusHeight+10, 50, 20)];
locationLabel.text=@"本地";
locationLabel.font=[UIFont systemFontOfSize:17];
locationLabel.textAlignment=NSTextAlignmentCenter;
locationLabel.textColor=[UIColor whiteColor];
[navView addSubview:locationLabel];
UILabel * likeTitle = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(locationLabel.frame), StatusHeight+10, 50, 20)];
likeTitle.text=@"关注";
likeTitle.font=[UIFont systemFontOfSize:16];
likeTitle.textAlignment=NSTextAlignmentCenter;
likeTitle.textColor=[UIColor whiteColor];
[navView addSubview:likeTitle];
UILabel * hotTitle = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(likeTitle.frame), StatusHeight+10, 50, 20)];
hotTitle.text=@"推荐";
hotTitle.font=[UIFont boldSystem