关于视频播放和下载开发的一些总结

2024-09-07 14:48

本文主要是介绍关于视频播放和下载开发的一些总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


在项目中遇到的一些问题和经验的分享:



KrVideoPlayerControlView 下载地址

先从视频播放说起,视频播放是借助于第三方的demo来做参考,cc视频的一个第三方,不过真心觉得cc视频很坑。建议不要在使用!

然后,做到最后实在是被改的做不下去,自该重新寻找新的方法,进行重新开始,

然后在网上看到了一个KrVideoPlayerController 的这个demo ,是做视频播放的,下载下来看了之后,觉得真的不错。下面来做个分享。。


视频播放器,引用与KrVideoPlayerController的第三方demo

首先在他的 里面是引用了系统的视频播放库 和导入头文件,别的地方也可以直接拿来用。里面可以根据自己的需要进行更改

#import<AVFoundation/AVFoundation.h>

 #import “KrVideoPlayerController.h ”


然后他用的是系统的SDK     MPMoviePlayerController 


里面使用到的有  ---- 观察者模式Observer就是KVO机制单列模式,代理delegate,通知NSNotificationCenter 等这些。。。


KrVideoPlayerController 他这里面做的不错的是,视图方法 和 执行方法 分的比较清楚,严格使用了MVC模式进


行开发。值得学习!


首先创建视频播放的视图:

这个视图是 MPMoviePlayerController 因为是继承与MPMoviePlayerController的,所有就相当于KrVideoPlayerControlView创建了视频播放控制器

- (KrVideoPlayerControlView *)videoControl
{if (!_videoControl) {_videoControl = [[KrVideoPlayerControlView alloc] init];}return _videoControl;
}

然后把要展现这个播放器,所以就把他展现出来,显示在我们的View上面,就要在初始化的时候给他加在我们的视图窗口

视图初始化
- (instancetype)initWithFrame:(CGRect)frame
{//隐藏视频全屏播放的标题栏self.videoControl.topBar.hidden = YES;self = [super init];if (self) {self.view.frame = frame;self.view.backgroundColor = [UIColor blackColor];[[HudWapper shared]HUDShowText:@"视频加载中..."];self.controlStyle = MPMovieControlStyleNone;[self.view addSubview:self.videoControl];//加在播放器在view上面self.videoControl.frame = self.view.bounds;//设置大小[self configObserver];//创建KVO 观察者对视频做的一个事实观察,执行方法[self configControlAction];//配置控件的执行方法。。[self ListeningRotating];//监听设备旋转方向}return self;
}
然后在子视图中加载他的子视图,加载所有的控件到View上面显示,他的播放按钮,播放进度条

可根据CGRectGet方法来设置每个按钮的坐标位置

Note【

float float_ = CGRectGetMaxX(CGRect rect);返回矩形右边缘的坐标

     CGRectGetMaxY返回矩形底部的坐标

     CGRectGetMidX返回矩形中心X的坐标

    CGRectGetMidY返回矩形中心Y的坐标

        CGRectGetMinX返回矩形左边缘的坐标

        CGRectGetMinY返回矩形顶部的坐标


在视频下载中,自己原本也想引用外部第三方,是WHC开头的第三方,但是那个第三方要的是一个url ,

我们项目中是没有视频url可提供的,提供的视频url 。必须是点击了这个视频才可以获取这个视频的url 。

和项目中的操作步骤 相悖,所有没办法只能去除那个集成好的视频url ,

自己根据项目中的videoid 来操作获取视频下载。。。


具体操作流程是。

  1 在加载全部内容列表的时候可以获取视频的全部内容,其中有视频的videoid 这个字段,我可以根据这个字段去下载我对应的视频。

  2  在点击下载的时候,需要改变态度,这个当时根据存放数组,还有本地来改, 


Note: 遇到问题是(但是如果没下载下来,或者下载后,删除了,这中间就出乱了  ,这个问题当时尤为头疼,最后选择

的办法是创建表


1, 我当时是建立了一个数组,存放视频的videoid ,

2   当你点击下载的时候他就把视频的videoid去数组中取出

3   然后根据这个videoid去下载视频,但是第二次来下载的时候,他还是取的数组的第一个,因为你本地存储后,他读取的时候数组被初始化,所有为空。

4  还有当你在本地存储的时候,他如果读到没有videoid的字段,他也会把这个videoid = nil 给你让你下载,这时候程序自然而然的崩溃

5 所有这个问题,当时试了好多方法,都是保存不到,要么就是为nil指针崩溃

6 最后创建了一张表数据,这三个数据,写了增删改查常用的方法

//视频下载中,视频id,视频下载完成三个属性
@property (nonatomic, retain) NSString * downLoad;
@property (nonatomic, retain) NSString * videoID;
@property (nonatomic, retain) NSString * downLoadFinish;
<pre name="code" class="objc">//创建视频下载的状态表  下载中,下载完成,视频ID[db executeUpdate:@"create table DownLoadList (DownLoading text, DownLoadFinish text ,VideoID text)"];}];
</pre><p></p><p class="p1"><span class="s1">//</span><span class="s2">插入消息数据(插入数据)</span></p><p class="p2"><span class="s2">-(</span><span class="s3">void</span><span class="s2">)insertDataToUserData:(</span><span class="s4">DownLoadModel</span><span class="s2"> *)user;</span></p><p class="p3"><span class="s2"></span></p><p class="p3"></p><p class="p1"><span class="s1">//</span><span class="s2">搜索用户(查询数据)</span></p><p class="p2"><span class="s2">-(</span><span class="s4">DownLoadModel</span><span class="s2"> *) selectUser:(</span><span class="s5">NSString</span><span class="s2"> *)userID;</span></p><p class="p2"><span class="s2"></span></p><p class="p3"><span class="s2"></span></p><p class="p1"><span class="s1">//</span><span class="s2">删除用户(删除数据)</span></p><p class="p2"><span class="s2">-(</span><span class="s3">void</span><span class="s2">)delegateUserMemberList:(</span><span class="s5">NSString</span><span class="s2"> *)userID;</span></p><p class="p2"><span class="s2"></span></p><p class="p3"><span class="s2"></span></p><p class="p1"><span class="s1">//</span><span class="s2">更新用户信息</span><span class="s1">(</span><span class="s2">修改信息</span><span class="s1">)</span></p><p class="p2"><span class="s2">-(</span><span class="s3">void</span><span class="s2">)updataUserInfor:(</span><span class="s4">DownLoadModel</span><span class="s2"> *)model;</span></p><pre name="code" class="objc">
 

具体实现自己可以定义自己想要执行的方法

//插入消息数据(插入数据)
//插入用户
-(void)insertDataToUserData:(DownLoadModel *)user
{    [defaultDBManager.databaseQueue inDatabase:^(FMDatabase *db) {self.database = db;if (user) {[db executeUpdate:@"insert into DownLoadList (DownLoading,DownLoadFinish,VideoID) values (?,?,?)" ,user.downLoad,user.downLoadFinish,user.videoID];//playVideo_Time}}];}
//查询状态
-(DownLoadModel *)selectUser:(NSString *)videoID
{__block DownLoadModel *model=nil;[defaultDBManager.databaseQueue inDatabase:^(FMDatabase *db) {self.database = db;FMResultSet * rs = [db executeQuery:@"select * from DownLoadList where VideoID = ?",videoID];while([rs next]) {model = [[DownLoadModel alloc]init];model.downLoad = [rs stringForColumn:@"DownLoading"];model.downLoadFinish = [rs stringForColumn:@"DownLoadFinish"];model.videoID = [rs stringForColumn:@"VideoID"];}}];return model;
}
//删除用户(删除数据)
-(void)delegateUserMemberList:(DownLoadModel *)videoid
{[defaultDBManager.databaseQueue inDatabase:^(FMDatabase *db) {self.database = db;[db executeUpdate:@"delete from DownLoadList where VideoID = ? ",videoid];}];
}
//更新用户信息(修改信息)
-(void)updataUserInfor:(DownLoadModel *)model
{[defaultDBManager.databaseQueue inDatabase:^(FMDatabase *db) {self.database = db;if (model) {
//          更新用户的信息[db executeUpdate:@"update DownLoadList set DownLoading = ? where VideoID = ?", model.downLoad,model.videoID];[db executeUpdate:@"update DownLoadList set DownLoadFinish = ? where VideoID = ?", model.downLoadFinish,model.videoID];}}];
}


这个就是控制用户下载,下载中,下载完成这些状态。


在我的项目中,有一个列表的封装,刚开始觉得没什么用,但是现在感觉还是不错的,对分段控制器是一个不错的用法。如果使用分段控制器UISegmentedControl  进行展示列表还是不错的一个封装的。。

#import <UIKit/UIKit.h>#pragma mark UITableViewDataSource
//- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
typedef NSInteger(^DWTableViewNumberOfRowsInSectionBlock)(UITableView *tableView, NSInteger section);//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
typedef UITableViewCell *(^DWTableViewCellForRowAtIndexPathBlock)(UITableView *tableView, NSIndexPath *indexPath);
//typedef id(^DWTableViewCellForRowAtIndexPath_t)(UITableView *tableView, NSIndexPath *indexPath);//- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
typedef NSInteger (^DWNumberOfSectionsInTableViewBlock)(UITableView * tableView);

@interface DWTableView : UITableView <UITableViewDelegate, UITableViewDataSource>@property (copy, nonatomic)DWTableViewNumberOfRowsInSectionBlock tableViewNumberOfRowsInSection;
@property (copy, nonatomic)DWTableViewCellForRowAtIndexPathBlock tableViewCellForRowAtIndexPath;
@property (copy, nonatomic)DWTableViewDidSelectRowAtIndexPathBlock tableViewDidSelectRowAtIndexPath;

具体实现的方法也是和使用UITableview的代理方法一样的使用,不过唯一就是自己可以对列表替换方便一点,不至于自己搞混。二个列表来回操作不会出现问题。



这篇关于关于视频播放和下载开发的一些总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145361

相关文章

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE