package com.bytx.ai.service.base.controller.util;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.MultimediaInfo;
import it.sauronsoftware.jave.MultimediaInfo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.SequenceInputStream;
import java.nio.ByteBuffer;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.io.RandomAccessFile;
import java.io.SequenceInputStream;
import java.nio.ByteBuffer;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.bytx.ai.service.utility.common.CodeConstans;
@RestController
@RequestMapping(value = "/cut", method = RequestMethod.POST, produces = CodeConstans.JSON_UTF_8)
public class WavCut {
/**
* 截取wav音频文件
* @param sourcepath 源文件地址
* @param targetpath 目标文件地址
* @param start 截取开始时间(秒)
* @param end 截取结束时间(秒)
* 这个方法是截取选中某段音频开始之前的音频分割
* return 截取成功返回true,否则返回false
*/
@RequestMapping(value = "/cutUtil")
public static boolean cut(String sourcefile, String targetfile, double start, double end) {
@RequestMapping(value = "/cutUtil")
public static boolean cut(String sourcefile, String targetfile, double start, double end) {
try{
if(!sourcefile.toLowerCase().endsWith(".mp3") || !targetfile.toLowerCase().endsWith(".mp3")){
return false;
}
File wav = new File(sourcefile);
if(!wav.exists()){
return false;
}
double t1 = getTimeLen(wav); //总时长(秒)
if(start<0 || end<=0 || start>=t1 || end>t1 || start>=end){
return false;
}
cut1(sourcefile, targetfile, start, end);
FileInputStream fis = new FileInputStream(wav);
cut1(sourcefile, targetfile, start, end);
FileInputStream fis = new FileInputStream(wav);
long wavSize = wav.length()-44; //音频数据大小(44为128kbps比特率wav文件头长度)
long splitSize = (long)((wavSize/t1)*start); //截取的音频数据大小
long skipSize = (long)((wavSize/t1)*0); //截取时跳过的音频数据大小
// long skipSize = (long)((wavSize/t1)*(t1-start)); //截取时跳过的音频数据大小
long skipSize = (long)((wavSize/t1)*0); //截取时跳过的音频数据大小
// long skipSize = (long)((wavSize/t1)*(t1-start)); //截取时跳过的音频数据大小
int splitSizeInt = Integer.parseInt(String.valueOf(splitSize));
int skipSizeInt = Integer.parseInt(String.valueOf(skipSize));
ByteBuffer buf1 = ByteBuffer.allocate(4); //存放文件大小,4代表一个int占用字节数
buf1.putInt(splitSizeInt+36); //放入文件长度信息
byte[] flen = buf1.array(); //代表文件长度
ByteBuffer buf2 = ByteBuffer.allocate(4); //存放音频数据大小,4代表一个int占用字节数
buf2.putInt(splitSizeInt); //放入数据长度信息
byte[] dlen = buf2.array(); //代表数据长度
flen = reverse(flen); //数组反转
dlen = reverse(dlen);
byte[] head = new byte[44]; //定义wav头部信息数组
fis.read(head, 0, head.length); //读取源wav文件头部信息
for(int i=0; i<4; i++){ //4代表一个int占用字节数
head[i+4] = flen[i]; //替换原头部信息里的文件长度
head[i+40] = dlen[i]; //替换原头部信息里的数据长度
}
byte[] fbyte = new byte[splitSizeInt+head.length]; //存放截取的音频数据
for(int i=0; i<head.length; i++){ //放入修改后的头部信息
fbyte[i] = head[i];
}
byte[] skipBytes = new byte[skipSizeInt]; //存放截取时跳过的音频数据
fis.read(skipBytes, 0, skipBytes.length); //跳过不需要截取的数据
fis.read(fbyte, head.length, fbyte.length-head.length); //读取要截取的数据到目标数组
fis.close();
File target = new File(targetfile);
if(target.exists()){ //如果目标文件已存在,则删除目标文件
target.delete();
}
FileOutputStream fos = new FileOutputStream(target);
fos.write(fbyte);
fos.write(fbyte);
fos.flush();
fos.close();
hebin();
}catch(IOException e){
hebin();
}catch(IOException e){
e.printStackTrace();
return false;
}
return true;
}
/**
* 截取音频结束end后的音频部分
return true;
}
/**
* 截取音频结束end后的音频部分
*/
public static boolean cut1(String sourcefile, String targetfile, double start, double end) {
public static boolean cut1(String sourcefile, String targetfile, double start, double end) {
try{
/* if(!sourcefile.toLowerCase().endsWith(".mp3") || !targetfile.toLowerCase().endsWith(".mp3")){
return false;
}
*/
StringBuffer targetfile1 = new StringBuffer(targetfile);
StringBuffer replace = targetfile1.replace(3, 4, "a");
String replace11 = replace.toString();
System.out.println(replace);
File wav = new File(sourcefile);
*/
StringBuffer targetfile1 = new StringBuffer(targetfile);
StringBuffer replace = targetfile1.replace(3, 4, "a");
String replace11 = replace.toString();
System.out.println(replace);
File wav = new File(sourcefile);
if(!wav.exists()){
return false;
}
double t1 = getTimeLen(wav); //总时长(秒)
if(start<0 || end<=0 || start>=t1 || end>t1 || start>=end){
return false;
}
FileInputStream fis = new FileInputStream(wav);
long wavSize = wav.length()-44; //音频数据大小(44为128kbps比特率wav文件头长度)
long splitSize = (long)((wavSize/t1)*(t1-end)); //截取的音频数据大小
// long skipSize = (long)((wavSize/t1)*0); //截取时跳过的音频数据大小
long skipSize = (long)((wavSize/t1)*end); //截取时跳过的音频数据大小
// long skipSize = (long)((wavSize/t1)*0); //截取时跳过的音频数据大小
long skipSize = (long)((wavSize/t1)*end); //截取时跳过的音频数据大小
int splitSizeInt = Integer.parseInt(String.valueOf(splitSize));
int skipSizeInt = Integer.parseInt(String.valueOf(skipSize));
ByteBuffer buf1 = ByteBuffer.allocate(4); //存放文件大小,4代表一个int占用字节数
buf1.putInt(splitSizeInt+36); //放入文件长度信息
byte[] flen = buf1.array(); //代表文件长度
ByteBuffer buf2 = ByteBuffer.allocate(4); //存放音频数据大小,4代表一个int占用字节数
buf2.putInt(splitSizeInt); //放入数据长度信息
byte[] dlen = buf2.array(); //代表数据长度
flen = reverse(flen); //数组反转
dlen = reverse(dlen);
byte[] head = new byte[44]; //定义wav头部信息数组
fis.read(head, 0, head.length); //读取源wav文件头部信息
for(int i=0; i<4; i++){ //4代表一个int占用字节数
head[i+4] = flen[i]; //替换原头部信息里的文件长度
head[i+40] = dlen[i]; //替换原头部信息里的数据长度
}
byte[] fbyte = new byte[splitSizeInt+head.length]; //存放截取的音频数据
for(int i=0; i<head.length; i++){ //放入修改后的头部信息
fbyte[i] = head[i];
}
byte[] skipBytes = new byte[skipSizeInt]; //存放截取时跳过的音频数据
fis.read(skipBytes, 0, skipBytes.length); //跳过不需要截取的数据
fis.read(fbyte, head.length, fbyte.length-head.length); //读取要截取的数据到目标数组
fis.close();
File target = new File(replace11);
if(target.exists()){ //如果目标文件已存在,则删除目标文件
target.delete();
}
FileOutputStream fos = new FileOutputStream(target);
fos.write(fbyte);
fos.write(fbyte);
fos.flush();
fos.close();
}catch(IOException e){
}catch(IOException e){
e.printStackTrace();
return false;
}
return true;
}
}
/**
* 合成音频方法
*/
public static void hebin() throws IOException {
FileInputStream fis1 = new FileInputStream("F:\Rec00010.mp3");
FileInputStream fis2 = new FileInputStream("F:\6.mp3");//你需要添加音频的中间部分
FileInputStream fis3 = new FileInputStream("F:\1.mp3");//你需要添加音频的中间部分
FileInputStream fis4 = new FileInputStream("F:\8.mp3");//你需要添加音频的中间部分
FileInputStream fis5 = new FileInputStream("F:\6.mp3");//你需要添加音频的中间部分
FileInputStream fis6 = new FileInputStream("F:\aec00010.mp3");
ArrayList<FileInputStream> c = new ArrayList<FileInputStream>();
c.add(fis1);
c.add(fis2);
c.add(fis3);
c.add(fis4);
c.add(fis5);
c.add(fis6);
Enumeration<FileInputStream> e = Collections.enumeration(c);
SequenceInputStream sis = new SequenceInputStream(e);
//创建输出流---要把前三个文件的内容读出来并且合并到seq4.txt;
FileOutputStream fos=new FileOutputStream("F:\d5.mp3");
int len=0;
byte buf[] = new byte[10];
while((len=sis.read(buf))!=-1){
fos.write(buf, 0, len);
}
fos.close();
sis.close();
}
public static void hebin() throws IOException {
FileInputStream fis1 = new FileInputStream("F:\Rec00010.mp3");
FileInputStream fis2 = new FileInputStream("F:\6.mp3");//你需要添加音频的中间部分
FileInputStream fis3 = new FileInputStream("F:\1.mp3");//你需要添加音频的中间部分
FileInputStream fis4 = new FileInputStream("F:\8.mp3");//你需要添加音频的中间部分
FileInputStream fis5 = new FileInputStream("F:\6.mp3");//你需要添加音频的中间部分
FileInputStream fis6 = new FileInputStream("F:\aec00010.mp3");
ArrayList<FileInputStream> c = new ArrayList<FileInputStream>();
c.add(fis1);
c.add(fis2);
c.add(fis3);
c.add(fis4);
c.add(fis5);
c.add(fis6);
Enumeration<FileInputStream> e = Collections.enumeration(c);
SequenceInputStream sis = new SequenceInputStream(e);
//创建输出流---要把前三个文件的内容读出来并且合并到seq4.txt;
FileOutputStream fos=new FileOutputStream("F:\d5.mp3");
int len=0;
byte buf[] = new byte[10];
while((len=sis.read(buf))!=-1){
fos.write(buf, 0, len);
}
fos.close();
sis.close();
}
/**
* 获取音频文件总时长
* @param filePath 文件路径
* @return
*/
public static double getTimeLen(File file){
double tlen = 0;
if(file!=null && file.exists()){
Encoder encoder = new Encoder();
try {
MultimediaInfo m = encoder.getInfo(file);
double ls = m.getDuration();
tlen = ls/1000;
} catch (Exception e) {
e.printStackTrace();
}
}
return tlen;
}
/**
* 数组反转
* @param array
*/
public static byte[] reverse(byte[] array){
byte temp;
int len=array.length;
for(int i=0;i<len/2;i++){
temp=array[i];
array[i]=array[len-1-i];
array[len-1-i]=temp;
}
return array;
}
public static void main(String[] args) throws ParseException, IOException{
long startTime = System.currentTimeMillis(); //获取开始时间
//he();
System.out.println(cut("C:\Users\13671\Desktop\yin\宽带新增开场白2.mp3","F:\Rec00010.mp3",8.8,9.5));
long endTime = System.currentTimeMillis(); //获取结束时间
long startTime = System.currentTimeMillis(); //获取开始时间
//he();
System.out.println(cut("C:\Users\13671\Desktop\yin\宽带新增开场白2.mp3","F:\Rec00010.mp3",8.8,9.5));
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
// System.out.println(cut("f:\111.wav","f:\111-cut_10_20.wav",10,20));
// System.out.println(cut("f:\111.wav","f:\111-cut_20_28.wav",20,28));
/* String aString= "1.013";
double a=Double.parseDouble(aString);
System.out.println(a);
double b=1000;
double c=(a*b);
System.out.println(c);
int i= (int)c;
System.out.println(i);*/
}
}
/* String aString= "1.013";
double a=Double.parseDouble(aString);
System.out.println(a);
double b=1000;
double c=(a*b);
System.out.println(c);
int i= (int)c;
System.out.println(i);*/
}
}