做一个音乐串烧

/*
 * 需求:做一个音乐串烧  
 * 分析:
 *    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();
}
}
}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值