• MP3音频文件的剪切合并方法


    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);*/
           
        
        }
        } 
       
  • 相关阅读:
    容器适配器
    告别格式工厂的视频格式转换方法(mac版 命令行)
    配置CentOS7的网络为固定IP
    Java 多线程学习--线程池
    Java多线程学习--[转]
    使用VLC接收RTP流并时时播放(RTP流是pcma包)
    [转载好文]Linux下编写 makefile 详细教程
    [转载]简明 VIM 练级攻略
    linux删除不了文件, 修改文件属性也删除不了的一个解决思路
    SHELL脚本“syntax error: unexpected end of file”解决方案[半原创]
  • 原文地址:https://www.cnblogs.com/sukuokuo/p/10842502.html
Copyright © 2020-2023  润新知