天天看点

【Java学习】将几首歌拼接成一首连续播放的大合唱(20)案例1:案例2

以任意字节切割mp3歌之后再拼接成完整的

  • 案例1:
    • 方法1
    • 方法2
  • 案例2
    • 将多首歌拼接成一首大合唱,优化代码

对一首歌或者多首歌按照1Mb进行切割保存,然后再将切割后的碎片拼接成一首的完整的歌,可以拼接多首歌.来个几十兆的大合唱.

案例1:

对一首歌按照1Mb进行切割保存,然后再将切割后的碎片拼接成一首的完整的歌

将g:\夜夜夜夜.mp3

切开存储g:\apartFile文件夹中

再访问文件夹拼接完整.

方法1

用随机访问流RandomAccessFile,可以控制文件指针

顺序流SequenceInputStream 拼接,可以传一个Enumeration迭代器

package com.westos.afternoon;

import java.io.*;
import java.util.Enumeration;
import java.util.Vector;

public class Demo5 {
    public static void main(String[] args) throws IOException {
        //用随机访问流,可以控制文件指针
        RandomAccessFile in = new RandomAccessFile(new File("g:\\夜夜夜夜.mp3"), "rw");
        byte[] bytes = new byte[1024];
        takeApart(in, bytes);//拆分
        mergingMusic(bytes);//合并

    }

    private static void takeApart(RandomAccessFile in, byte[] bytes) throws IOException {
        //我的这首歌是4.6兆左右,按照一兆一切可以切5份
        File file = new File("g:\\apartFile");
        if(!file.exists()){
            file.mkdirs();
        }
        for (int i = 1; i < 6; i++) {
            //切开生成5个
            FileOutputStream out = new FileOutputStream("g:\\apartFile\\apart" + i + ".mp3");
            int len = 0;
            while (in.getFilePointer() < 1024*1024 * (i) && (len = in.read(bytes)) != -1) {
                out.write(bytes, 0, len);
                out.flush();
                //System.out.println(in.getFilePointer());
            }
        }
    }
    private static void mergingMusic(byte[] bytes) throws IOException {
        Vector<FileInputStream> vector = new Vector<>();
        File file = new File("g:\\apartFile");
        File[] files = file.listFiles();
        for (File f : files) {
            vector.add(new FileInputStream(f));
        }
        Enumeration<FileInputStream> elements = vector.elements();
        //顺序流SequenceInputStream可以传一个Enumeration迭代器
        SequenceInputStream sq = new SequenceInputStream(elements);
        FileOutputStream copy = new FileOutputStream("g:\\apartFile\\夜夜夜夜.mp3",true);
        int len = 0;
        byte[] bytes1 = new byte[1024];
        while ((len = sq.read(bytes)) != -1) {
            copy.write(bytes, 0, len);
        }
        copy.close();
        sq.close();
    }

}


           

方法2

用字节缓冲区,一次缓冲1Mb存1Mb

package org.westos.demo2;

import java.io.*;
import java.util.Vector;

/**
 * @Author: Administrator
 * @CreateTime: 2019-01-18 15:17
 * @Description todo
 */
public class MyTest5 {
    public static void main(String[] args) throws IOException {

        chaifen(); //拆分文件

        hebing();//合并文件

    }

    private static void hebing() throws IOException {
        File file1 = new File("g:\\music");
        File[] files = file1.listFiles();
        Vector<FileInputStream> v = new Vector<>();
        for (File f : files) {
            if (f.isFile() && f.getName().endsWith(".mp3")) {
                FileInputStream in = new FileInputStream(f);
                v.add(in);
            }
        }

        SequenceInputStream sin = new SequenceInputStream(v.elements());
        byte[] bytes = new byte[1024 * 1024];
        int len = 0;
        FileOutputStream out = new FileOutputStream("g:\\music\\夜夜夜夜-齐秦.mp3");
        while ((len = sin.read(bytes)) != -1) {
            out.write(bytes, 0, len);
            out.flush();
        }
        sin.close();
        out.close();
    }

    private static void chaifen() throws IOException {
        File file = new File("夜夜夜夜.mp3");
        //2.封装一个文件夹
        File file1 = new File("g:\\music");
        if (!file1.exists()) {
            file1.mkdirs();
        }
        FileInputStream in = new FileInputStream(file);

        //拆分文件
        byte[] bytes = new byte[1024 * 1024];//一次取出1Mb,存1Mb
        int len = 0;
        int i = 1;
        while ((len = in.read(bytes)) != -1) {
            FileOutputStream out = new FileOutputStream(new File(file1, (i++) + ".mp3"));
            out.write(bytes, 0, len);
            out.close();
        }
        in.close();
    }
}

           

案例2

将多个音乐切割并拼接成一首歌

例如以下三首:

g:\情书.mp3

g:\夜夜夜夜.mp3

g:\怎样.mp3

拼接成g:\Copy.mp3

将多首歌拼接成一首大合唱,优化代码

package com.westos.afternoon;

import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Vector;

public class Demo5 {
    public static void main(String[] args) throws IOException {
        //用随机访问流,可以控制文件指针
        //常见要合并的歌曲,以下三首
        RandomAccessFile in = new RandomAccessFile(new File("g:\\情书.mp3"), "rw");
        RandomAccessFile in1 = new RandomAccessFile(new File("g:\\夜夜夜夜.mp3"), "rw");
        RandomAccessFile in2 = new RandomAccessFile(new File("g:\\怎样.mp3"), "rw");
        ArrayList<RandomAccessFile> list = new ArrayList<>();
        list.add(in);
        list.add(in1);
        list.add(in2);
        for (RandomAccessFile randomAccessFile : list) {

            takeApart(randomAccessFile);//拆分成10份,每次循环覆盖
            mergingMusic();//合并这10分

        }


    }

    private static void takeApart(RandomAccessFile in) throws IOException {
        //我的这首歌是4.6兆左右,按照一兆一切可以切5份,但是我考虑到有的歌大于5兆,就分成10份,相当于可以存10兆之内的歌
        File file = new File("g:\\apartFile");
        if(!file.exists()){
            file.mkdirs();
        }
        for (int i = 1; i < 11; i++) {
            //切开生成5个
            FileOutputStream out = new FileOutputStream("g:\\apartFile\\apart" + i + ".mp3");
            int len = 0;
            byte[] bytes = new byte[1024];
            while (in.getFilePointer() < 1024*1024 * (i) && (len = in.read(bytes)) != -1) {
                out.write(bytes, 0, len);
                out.flush();
                //System.out.println(in.getFilePointer());
            }
            out.close();
        }

    }
    private static void mergingMusic() throws IOException {
        Vector<FileInputStream> vector = new Vector<>();
        File file = new File("g:\\apartFile");
        File[] files = file.listFiles();
        for (File f : files) {
            if(f.isFile()&&f.getName().substring(0, 5).equals("apart")){
                vector.add(new FileInputStream(f));
            }

        }
        Enumeration<FileInputStream> elements = vector.elements();
        //顺序流SequenceInputStream可以传一个Enumeration迭代器
        SequenceInputStream sq = new SequenceInputStream(elements);
        FileOutputStream copy = new FileOutputStream("g:\\Copy.mp3",true);
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = sq.read(bytes)) != -1) {
            copy.write(bytes, 0, len);
        }
        copy.close();
        sq.close();
    }

}


           

结果:

将一首歌切成10块,每块最大1024kb,每次循环覆盖原有的

【Java学习】将几首歌拼接成一首连续播放的大合唱(20)案例1:案例2

Copy.mp3就是最后结果,将3首歌拼接在了一起.

【Java学习】将几首歌拼接成一首连续播放的大合唱(20)案例1:案例2

谢谢