package com.bytx.ai.service.base.controller.util; import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.MultimediaInfo;    import java.io.File;  import java.io.FileInputStream;
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 org.springframework.web.bind.annotation.RequestMapping;
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) {          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);              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));  //截取时跳过的音频数据大小              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.flush();              fos.close(); 
            hebin();
        }catch(IOException e){              e.printStackTrace();              return false;          } 
     
        return true; 
      
    } 
  /**
   
     * 截取音频结束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);              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);  //截取时跳过的音频数据大小              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.flush();              fos.close(); 
           
        }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();
    }
          /**      * 获取音频文件总时长      * @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(); //获取结束时间      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);*/
       
    
    }
    } 
   
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄