断点续传-视频文件的分块和合并

news2024/11/23 19:23:12

目录

一,前言

二,断点续传

三,断点续传流程:

四,java代码测试分块和合并

视频文件分块: 

视频文件合并:

五,应用(简单了解)


一,前言

通常视频文件都比较大,项目中需要满足大文件的上传要求,http协议本身对上传文件大小没有限制,但是客户的网络质量,电脑硬件环境等参差不齐,如果一个大的文件上传过程中网断了没有上传完成,用户体验就会很差。所以对于大文件上传的要求最基本的就是断点续传。

二,断点续传

FTP(文件传输协议的简称)(File Transfer Protocol、 FTP)客户端软件断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载。用户可以节省时间,提高速度。

可以从中提炼出来两个点:

1.将下载上传任务人为的划分成几个部分,从大文件切割成小文件

2.如果出现故障,可以接着上次已经上传的部分继续上传,不用从头再来浪费时间

三,断点续传流程:

在项目里,文件分块是前端来完成的,后端接受分块并且将之按照顺序(重点)合并在一起。

如果上传发生了中断,那么会重新上传,后端会检查当前这一块是否已经上传过了,如果已经上传过了,就不会再上传。

四,java代码测试分块和合并

视频文件分块: 

1.创建一个名为bigfile_test的文件夹,里面放上一个视频文件和等会分块放的文件夹chunk。(我的大概是30M)

2.分块流程:

1)根据指定的分块大小计算出分块数量

2)使用RandomAccessFile类来从源文件中读数据写到分块文件中,如果分块文件的长度达到了分块大小,写下一个分块

3)测试

3.编写分块代码:

    @Test
    public void testChunk() throws IOException {
        //源文件路径
        File sourcefile = new File("D:\\bigfile_test\\森林光影_丁达尔效应.mp4");
        //分块文件存放的路径
        File chunkpath = new File("D:\\bigfile_test\\chunk\\");
        if (!chunkpath.exists()) {
            chunkpath.mkdirs();
        }
        //指定分块的大小 1M = 1024k 1k=1024字节
        int chunkSize = 1024 * 1024 * 1;
        //分块总数
        int chunkNums = (int) Math.ceil(1.0 * sourcefile.length() / chunkSize);
        //流对象读取源文件 向分块文件写数据  当达到了分块大小  不再写
        byte[] data = new byte[1024];
        RandomAccessFile raf_read = new RandomAccessFile(sourcefile, "r");
        for (int i = 0; i < chunkNums; i++) {
            //创建空白文件
            File file = new File(chunkpath.getPath() + "\\" + i);
            boolean isok = file.createNewFile();//文件存在会创建失败
            RandomAccessFile raf_write = new RandomAccessFile(file, "rw");
            if (isok) {//向文件中写内容
                int len = -1;
                while ((len = raf_read.read(data)) != -1) {
                    raf_write.write(data, 0, len);
                    if (file.length() >= chunkSize) {//达到分块大小就不再写了
                        break;
                    }
                }
            }
            raf_write.close();
        }
        raf_read.close();
    }

4.打开chunk文件夹,可以看到分块,只有最后一块的大小不是1024KB,其他都是。

这个视频文件是30M,所以分成了31块。

视频文件合并:

接下来需要将上面的分块合并起来,检查是否能成功合成源文件。

1.合并流程:

1) 将chunk文件按照次序放到集合中(排序)

2)使用RandomAccessFile类将chunk文件数据依次写到merge文件中

3)检查是否合并成功

注意: 写的次序一定要按照分块号的次序

2.编写合并代码

    @Test
    public void testMerge() throws IOException {
        //源文件
        File sourceFile = new File("D:\\bigfile_test\\森林光影_丁达尔效应.mp4");//用于校验合并之后的视频文件是否正确
        if (!sourceFile.exists()) sourceFile.createNewFile();
        //分块文件目录
        File chunkpath = new File("D:\\bigfile_test\\chunk\\");
        if (!chunkpath.exists()) chunkpath.mkdirs();
        //合并之后的文件
        File mergeFile = new File("D:\\bigfile_test\\分块合并_森林光影_丁达尔效应.mp4");
        if (mergeFile.exists()) mergeFile.delete();

        //目录下所有的分块文件
        File[] chunkFiles = chunkpath.listFiles();
        List<File> chunkFileList = Arrays.asList(chunkFiles);
        //必须按照序号的顺序进行合并
        Collections.sort(chunkFileList, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return Integer.parseInt(o1.getName()) - Integer.parseInt(o2.getName());
            }
        });
        byte[] data = new byte[1024];
        RandomAccessFile raf_write = new RandomAccessFile(mergeFile, "rw");//如果文件不存在会创建文件
        for (File chunkFile : chunkFiles) {
            RandomAccessFile raf_read = new RandomAccessFile(chunkFile, "r");
            int len = -1;
            while ((len = raf_read.read(data)) != -1) {
                raf_write.write(data, 0, len);
            }
        }

        //检验是否合并正确
        FileInputStream sis = new FileInputStream(sourceFile);
        FileInputStream mis = new FileInputStream(mergeFile);
        String sMd5Hex = DigestUtils.md5DigestAsHex(sis);
        String mMd5Hex = DigestUtils.md5DigestAsHex(mis);
        if (sMd5Hex.equals(mMd5Hex)) {
            System.out.println("视频文件合并成功");
        } else {
            System.out.println("视频文件合并失败");
        }
    }

3.查看合并成功的文件

五,应用(简单了解)

有时用户上传下载文件需要历时数小时,万一线路中断,不具备断点续传的FTP服务器或下载软件就只能从头重传,比较好的FTP服务器或下载软件具有FTP断点续传能力,允许用户从上传下载断线的地方继续传送,这样大大减少了用户的烦恼。

IE浏览器默认下载方式不支持断点续传。

常见的支持断点续传的上传、下载软件:QQ旋风、迅雷、快车(迷你快车)、web迅雷、影音传送带、快车、BitComet、电驴eMule、哇嘎Vagaa、RF[RaySourse/RayFile]、酷6、土豆、优酷、百度视频、新浪视频、腾讯视频、百度云等都支持断点续传。

在 *nix(Linux/Unix)系统下,常用支持断点续传的FTP客户端软件是lftp。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1579525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读博做FPGA上的AI加速能不能搞啊?

从企业的角度来看&#xff0c;选择在FPGA上进行AI加速仍然有其一定的优势和适用场景&#xff0c;但也有一些挑战需要考虑。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给…

人工智能_大模型023_AssistantsAPI_01_OpenAI助手的创建_API的调用_生命周期管理_对话服务创建---人工智能工作笔记0159

先来说一下一些问题: 尽量不要微调,很麻烦,而且效果需要自己不断的去测试. 如果文档中有图表,大量的图片去分析就不合适了. 是否用RAG搜索,这个可以这样来弄,首先去es库去搜能直接找到答案可以就不用去RAG检索了,也可以设置一个分,如果低于60分,那么就可以去进行RAG检索 微…

网络通信流程

建立完tcp请求再发起http请求 开启系统代理之后&#xff0c;以clash verge为例 127.0.0.1:7897&#xff0c;假设hci.baidu.com的IP为153.37.235.50 发起对hci.baidu.com的HTTP请求&#xff0c;由于开启了系统代理不进行DNS解析&#xff0c;浏览器调用socket()获得一个socket&a…

平面图设计利器:推荐4款好用软件助你完成任务!

在移动应用程序或网页UI设计项目中&#xff0c;平面图软件是必不可少的。市场上的平面图绘制软件层出不穷。UI设计师有必要了解如何找到一款简单易用、专业的平面图绘制软件。本文将分享四款流行的平面图绘制软件&#xff0c;每一款都具有不同的设计功能、易学性和性价比。 即…

基于单片机数码管20V电压表仿真设计

**单片机设计介绍&#xff0c;基于单片机数码管20V电压表仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机数码管20V电压表仿真设计的主要目的是通过单片机和数码管显示电路实现一个能够测量0到20V直流电压的电…

【Redis系列】Spring Boot 集成 Redis 实现缓存功能

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

机器学习知识点

1鸢尾花分类 鸢尾花分类问题是一个经典的机器学习问题&#xff0c;旨在根据鸢尾花的花萼长度、花萼宽度、花瓣长度和花瓣宽度等特征&#xff0c;将鸢尾花分成三个品种&#xff1a;山鸢尾&#xff08;setosa&#xff09;、变色鸢尾&#xff08;versicolor&#xff09;和维吉尼亚…

云服务器的特点

云服务器是一种基于云计算技术的服务器服务&#xff0c;它提供了可灵活扩展的计算资源和环境。Rak部落小编为您整理发布云服务器的特点&#xff0c;希望对您有帮助。 以下是云服务器的一些主要特点&#xff1a; 1. **灵活性**&#xff1a;云服务器允许用户根据业务需求灵活地配…

经纬恒润首个重卡车身域控制器成功量产

近日&#xff0c;经纬恒润自主研发的首个商用车车身域控制器已搭载江淮格尔发K7成功量产。此次量产成功&#xff0c;将助力江淮格尔发K7的智能舒适性提升&#xff0c;配合江淮L2级智能驾驶系统&#xff0c;大大提高终端用户的使用体验。 伴随软件定义汽车和汽车智能化、网联化…

达梦关键字(如:XML,EXCHANGE,DOMAIN,link等)配置忽略

背景&#xff1a;在使用达梦数据库时&#xff0c;查询SQL中涉及XML,EXCHANGE,DOMAIN,link字段&#xff0c;在达梦中是关键字&#xff0c;SQL报关键词不能使用的错误。 解决办法&#xff1a; 配置达梦安装文件E:\MyJava\dmdbms\data\DAMENG\dm.ini 忽略这些关键词&#xff0c;…

windows安装使用nacos

1.下载安装包 网址&#xff1a;Releases alibaba/nacos GitHub 2.解压&#xff0c;bin目录下修改启动脚本为单机 3.修改数据库配置&#xff0c;使用本地mysql数据库 3.1 创建nacos数据库 3.2 执行 nacos\conf 目录下数据库脚本 4.修改nacos\conf目录下数据库配置 5.点击运…

【AOP入门案例深解析】

AOP 1.AOP简介 AOP&#xff08;Aspect Oriented Programming&#xff09;面向切面编程&#xff0c;是一种编程范式&#xff0c;指导开发者如何组织程序结构 OOP&#xff08;Object Oriented Programming&#xff09;面向对象编程 作用&#xff1a;在步惊动原始设计的基础上进行…

第二证券|“元素周期表”行情延续 资源股牛市引发激辩

4月8日&#xff0c;以黄金等贵金属、铜等工业金属为首的周期板块继续狂飙。无论是现货&#xff0c;仍是商品期货&#xff0c;抑或是股票商场的资源股&#xff0c;价格均在继续扬升。赛道股和周期股的“跷跷板”效应接连&#xff0c;医药、光伏、芯片等板块普跌。 截至收盘&…

统信UOS系统初识--研发岗

第一步 获取root权限 配置环境等都需要用到root权限&#xff0c;所以我们先获取到root权限&#xff0c;方便下面的操作 下载软件 在UOS应用商店下载的所需应用 版本都比较低 安装node 官网下载了【arm64】的包&#xff0c;解压到指定文件夹&#xff0c;设置链接&#xff0…

Codeforces Round 938 (Div. 3) (A~E)

Codeforces Round 938 (Div. 3) (A~E) 目录&#xff1a;A B C D E A题&#xff1a;Yogurt Sale 标签: 数学&#xff08;math&#xff09; 题目大意 酸奶价格&#xff0c; a 元一份&#xff0c;b元两份n问&#xff1a;买n份最少多少钱 思路 a元一份&#xff0c;b元两份&#…

css实现各级标题自动编号

本文在博客同步发布&#xff0c;您也可以在这里看到最新的文章 Markdown编辑器大多不会提供分级标题的自动编号功能&#xff0c;但我们可以通过简单的css样式设置实现。 本文介绍了使用css实现各级标题自动编号的方法&#xff0c;本方法同样适用于typora编辑器和wordpress主题…

【C++】C++11可变参数模板

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 可变参数模板的定义…

简化您的实验室:用于样品瓶库存跟踪的高级批量扫描

在实验室工作需要精确和高效。跟踪小瓶库存至关重要但很耗时。忘记手动扫描并使用 Dynamsoft Barcode Reader进行自动批量扫描。 点击下载Dynamsoft最新版https://www.evget.com/product/3691/download 具有批量扫描功能的管式和架式扫描仪 批量扫描在扫描托盘上的小瓶时特别…

微信小程序自定义tabbar,页面切换存在闪动【解决方案】

需求&#xff1a; 自定义tabbar&#xff0c;在需要的几个主页面都加入这么一个组件&#xff0c;但是有个情况&#xff1b;而组件中使用照片&#xff08;svg或png&#xff09;和文字;在切换tabbar的时候&#xff0c;跳转相应的页面&#xff0c;运行到真机或是模拟器&#xff0c;…

中国国家博物馆古代钱币展

第一部分&#xff0c;以时间为线介绍四次变革 贝壳 春秋战国&#xff1a;刀币布币圆钱。从春秋时期进入金属铸币阶段到战国时期已确立布币&#xff0c;刀币&#xff0c;蚁鼻钱&#xff0c;环钱四大货币体系。 秦&#xff1a;圆形方孔&#xff08;直到清末机器铸钱变为无孔&a…