做一个音乐串烧

    xiaoxiao2021-04-14  76

    /*  * 需求:做一个音乐串烧    * 分析:  *    1. 有n个音乐,找到高潮部分,  *    2. 获取高潮部分的流对象  *    3. 把这部分对象保存成一个mp3  *    4. 把它们拼接起来

     */

    可以鼠标右键---属性  查看“有声读物 - 弟子规 - 童声朗诵版。mp3”文件的大小

    点击详细信息查看比特率 此MP3的比特率为128kbps 即是128*1024bps。

    例如想截取的音乐段是“有声读物 - 弟子规 - 童声朗诵版。mp3”的第10s~34s

    方法一:

    因为比特率是指每秒传送的比特(bit)数。  1B(Byte)=8b(bit) 。

    所以“有声读物 - 弟子规 - 童声朗诵版。mp3”   1秒的字节数=比特率/8=128*1024/8=16384 B

    则10s的字节数为16384*10B   , 34s的字节数为16384*34=557056B

    方法二:

    MP3总字节数a/.总时间b=求的字节数c/ 想截取的时间点d

    a=19,152,896 字节   b=19分56秒=1196s       d=10s  求得c等于16015

    两个方法相差的字节数不大。我试过都行。

    运行下列代码即可截取出”弟子规1.MP3“

    package file; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CutMusic { public static void main(String[] args) { BufferedInputStream bis = null;//缓冲区 BufferedOutputStream bos = null; int start = 163840;  //  开始的字节数 int end = 16384*34;//  结束的字节数

    try {//通过字节输入流、字节输出流操作数据 bos = new BufferedOutputStream(new FileOutputStream("d:\\弟子规.mp3"));生成的文件 bis = new BufferedInputStream(new FileInputStream("d:\\有声读物 - 弟子规 .mp3"));//读取的文件 byte[] b = new byte[1024]; int len = 0; int total = 0;

    每次读1024字节,只要len不等于-1则继续读 while ((len = bis.read(b)) != -1) { total += len; // 如果小于开始字节的就抛弃掉 if (total < start) { continue; } bos.write(b); // 如果大于 结尾字节数 就终止读取 if (total >= end) { bos.flush();满足条件则刷新一次 break; } } } catch (IOException e) { e.printStackTrace(); } finally { try { if (bos != null) bos.close();//关闭输出流 if (bis != null) bis.close();// 关闭输入流 } catch (IOException e) { e.printStackTrace(); } } }

    }

    bos = new BufferedOutputStream(new FileOutputStream("d:\\弟子规.mp3"));生成的文件

    改掉括号里面的字符串名即可生成新的MP3

    最后合并你截取的MP3

    方法一:

    public class CombineMusic { public static void main(String[] args) { BufferedInputStream bis1 = null; BufferedInputStream bis2 = null; BufferedOutputStream bos = null; SequenceInputStream si = null; try { bos = new BufferedOutputStream(new FileOutputStream("弟子规合.mp3",true)); bis1 = new BufferedInputStream(new FileInputStream("弟子规1.mp3")); bis2 = new BufferedInputStream(new FileInputStream("弟子规2.mp3")); si = new SequenceInputStream(bis1,bis2); byte[] b = new byte[1024]; int len = 0; while ((len = si.read(b)) != -1) { bos.write(b,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (si != null) si.close(); if (bis1 != null) bis1.close(); if (bis2 != null) bis2.close(); } catch (IOException e) { e.printStackTrace(); } } } }

    方法二:

    package file; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CombineMusic { public static void main(String[] args) { BufferedInputStream bis1 = null; BufferedInputStream bis2 = null; BufferedOutputStream bos = null; try { bos = new BufferedOutputStream(new FileOutputStream("弟子规合.mp3",true)); bis1 = new BufferedInputStream(new FileInputStream("弟子规1.mp3")); bis2 = new BufferedInputStream(new FileInputStream("弟子规2.mp3")); byte[] b = new byte[1024]; int len = 0; int total = 0; while ((len = bis1.read(b)) != -1) { //读弟子规1.mp3" bos.write(b);先写弟子规1.mp3" } while ((len = bis2.read(b)) != -1) { //读弟子规.mp3" bos.write(b);//再写弟子规.mp3" } } catch (IOException e) { e.printStackTrace(); } finally { try { if (bos != null) bos.close(); if (bis1 != null) bis1.close(); if (bis2 != null) bis2.close(); } catch (IOException e) { e.printStackTrace(); } } } }

    转载请注明原文地址: https://ju.6miu.com/read-670241.html

    最新回复(0)