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

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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来