首页 > 其他分享 >断点续传-视频文件的分块和合并

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

时间:2024-04-09 11:30:50浏览次数:30  
标签:断点续传 分块 File 视频文件 new 上传

目录

一,前言

二,断点续传

三,断点续传流程:

四,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。

标签:断点续传,分块,File,视频文件,new,上传
From: https://blog.csdn.net/m0_59925573/article/details/137543105

相关文章

  • 分块与莫队
    不沾树的博客变短了好多。分块例题这道题显然可以使用线段树乱搞过去,不过为了给主角面子我们假设我们不会做。对于一些难以使用数据结构维护答案的序列问题,我们考虑暴力。但是暴力太慢了,于是人们提出了分块。分块,就是把序列分成许多的小段,通过一些神秘的处理实现优化暴力。......
  • 【学习笔记】数论分块
    先看一个例子:给出正整数\(n(n\leq10^{12})\),计算:\[\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\]如果直接暴力,复杂度为\(O(n)\),无法在1s内通过,但使用数论分块(整除分块)可以将复杂度降至\(O(\sqrt{n})\)。先看个例子,当\(n=100\)时,\(i\)和\(\lfloor\frac{n}{i}\r......
  • 重生之分块修炼
    \(\textit{2024.1.2711:45}\),召唤最强从者——职阶为\(\textit{Oier}\)的\(\textit{Soul}\)_\(\textit{Love}\)协助学习分块。\(\textit{2024.1.2714:30}\),从《分块(块状数组)(从入门到出门右拐)》开始。重修分块。\(\textit{2024.1.2811:20-11:46}\),拿P3372【模板】......
  • 内存分块!
    这是我在学习这方面知识的笔记,主要是网课上老师讲的内容和一些自己的想法,整理了一下,希望对学习这方面知识的小伙伴有帮助:)1.内存条全局区:    全局变量    静态变量  (static关键字)    常量:      字符串常量      con......
  • 2024-4-4 分块补题
    P3203[HNOI2010]弹飞绵羊记录每个位置跳出当前块所需要的步数和跳出的位置。从后往前统计#include<bits/stdc++.h>#definemaxn200100usingnamespacestd;intn,m,len;intpos[maxn],k[maxn];intnxt[maxn],stp[maxn];structfk{intl,r;}a[maxn];intread(){......
  • 2024/4/4 分块补题
    2024/4/4分块补题P3203[HNOI2010]弹飞绵羊分块跳跳跳,核心是每次跳出当前块,用\(to[i]\)表示跳到的位置。#include<bits/stdc++.h>usingnamespacestd;#defineldlongdoubletemplate<typenameT>inlineTread(){Tx=0;charch=getchar();boolfl=false;......
  • 数论分块学习笔记
    数论分块学习笔记性质数论分块用于快速计算含有除法向下取整的和式,即形如\(\sum_{i=1}^nf(i)g(\lfloor\frac{n}{i}\rfloor)\)的式子。当预处理出\(f\)的前缀和时,数论分块可以在\(O(\sqrt{n})\)的时间复杂度下计算上述和式的值。求解引理\(1\):\(\foralla,b,c\in\math......
  • Go断点续传
    安装第三方包gogetgithub.com/tus/tusd/v2packagemainimport( "fmt" "net/http" "github.com/tus/tusd/v2/pkg/filestore" tusd"github.com/tus/tusd/v2/pkg/handler")funcmain(){ //本地磁盘 store:=filestore.FileS......
  • 爬虫(m3u8格式视频文件)
    点击查看代码importreimportrequestsfromlxmlimportetreeimportasyncioimportaiohttpimportaiofilesimportosfromCrypto.CipherimportAES#获取第一层m3u8文件的url并下载deffirst_m3u8_url(url):resp=requests.get(url,verify=False)html......
  • 数论分块
    文章借用: 浅谈数论分块-洛谷专栏(luogu.com)求$\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor$,其中$n$为常数。为了方便我们的研究,我使用绘图软件画出了$f(x)=\frac{7}{x}(1\leqx\leq7)$的图像,也就是一种反比例函数的图像。 因为求的值是向下取整的,显然函数$f(x)$......