视频合块问题总结

该博客讨论了一个视频块合并的问题,当视频被拆分成超过十块时,由于文件命名导致合块顺序错误,从而使得合并后的视频无法播放。解决方案包括对文件进行排序以确保合并顺序正确,或者在命名时避免使用可能导致排序混乱的数字。提供了两种修复代码示例,一种通过比较文件名排序,另一种在遍历时直接指定文件顺序。
摘要由CSDN通过智能技术生成

1视频合块代码,正确代码无错

//测试文件合块方法
    @Test
    public void mergeChunk() throws Exception {
        //指定块文件所在目录
        String chunkFileDirPath = "D:\\Temp\\zentisa\\chunk\\";
        File chunkDirFile = new File(chunkFileDirPath);  // 创建文件列表对象

        // 通过文件列表对象,获取块文件列表信息
        File[] files = chunkDirFile.listFiles();

        // 给视频排序,超过10块的视频 会从1直接到10,所以要排序保证 合块的视频顺序正确
        List<File> fileList = new ArrayList<File>(Arrays.asList(files));
        Collections.sort(fileList, new Comparator<File>() {
            @Override
            public int compare(File file1, File file2) {

                if(Integer.parseInt(file1.getName())>Integer.parseInt(file2.getName())){
                    return 1;
                }
                return -1;
            }
        });

        //指定合并文件所在路径
        String mergeFilePath = "D:\\Temp\\zentisa\\hekuai\\bys.mp4";
        File mergeFile = new File(mergeFilePath);

        //创建输出流
        RandomAccessFile rw = new RandomAccessFile(mergeFile, "rw");
        rw.seek(0);  // 指定从文件的那个位置开始写,0,从头开始写

        //创建缓冲区
        byte[] bytes = new byte[1024];

        int len = -1;
        //遍历块文件,写入输出流

        for(File file:fileList){
            //创建输入流
            RandomAccessFile r = new RandomAccessFile(file, "r");

            while((len = r.read(bytes)) != -1){ // 不等于 -1 的时候就 继续读
                rw.write(bytes,0,len);
            }
            r.close();
        }
        rw.close();

    }

2.错误问题总结

        2.1:问题:合块代码执行后,代码运行正常,合块正常,视频大小和拆分前一样。就是不能播放。因为视频是以数字来命名的,所以在合块的时候 0 过后就是10 之后 11,跳过了 1~9,视频合块不超过十块的时候是能正常执行的,超过十块后,就会出现这个问题。

                解决方法一:这是业务问题,不是技术问题。添加一个集合让有序排列就好了

// 给视频排序,超过10块的视频 会从1直接到10,所以要排序保证 合块的视频顺序正确
        List<File> fileList = new ArrayList<File>(Arrays.asList(files));
        Collections.sort(fileList, new Comparator<File>() {
            @Override
            public int compare(File file1, File file2) {

                if(Integer.parseInt(file1.getName())>Integer.parseInt(file2.getName())){
                    return 1;
                }
                return -1;
            }
        });

                解决方法二:

//测试文件合块方法二
    @Test
    public void mergeChunk1() throws Exception {

        //指定块文件所在目录
        String chunkFileDirPath = "F:\\video\\chunk\\";
        File chunkDirFile = new File(chunkFileDirPath);
        //获取块文件列表信息
        File[] files = chunkDirFile.listFiles();

        //指定合并文件所在路径
        String mergeFilePath = "F:\\video\\bys1.mp4";
        File mergeFile = new File(mergeFilePath);

        //创建输出流
        RandomAccessFile rw = new RandomAccessFile(mergeFile, "rw");
        rw.seek(0);
        //创建缓冲区
        byte[] bytes = new byte[1024];

        int len = -1;
        //遍历块文件,写入输出流
        for(int i=0;i<files.length;i++){
            File file = new File(chunkFileDirPath + i);
            //创建输入流
            RandomAccessFile r = new RandomAccessFile(file, "r");

            while((len = r.read(bytes)) != -1){
                rw.write(bytes,0,len);
            }
            r.close();
        }
        rw.close();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值