java切割音频文件

工具:

一个jar包即可:jave-1.0.2.jar

可以切割wav格式的音频文件

完整工程目录

就一个jar包,一个main类

代码:

package com.zit;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;

import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.MultimediaInfo;
/**
 * wav音频文件截取工具
 * (适用于比特率为128kbps的wav音频文件,此类音频文件的头部信息占用长度44字节)
 * @author 王晓东
 *
 */
public class ReadVideo {

	public static void main(String[] args) {
//		System.out.println(cut("E:\\record.mp3","E:\\record-cut_0_15.mp3", 0, 15)); //大于18(也可能别的值),会读取不了
//      System.out.println(cut("E:\\record_40s.wav","E:\\record-cut_15_30.wav", 15, 30));  

		int start = 0;
		int end = 0;
        int count = 10;
        String sourcefile = "E:\\test.wav";
        long time = getTimeLen(new File(sourcefile));
        int newTime = (int)time;
        int internal = newTime - end;
        while(internal > 0) {
        	if(internal < 10) {
        		cut(sourcefile, "E:\\record-cut_" + start + "_" + (int)time +".wav", start, (int)time);
        		end += count;
        		internal = newTime - end;
        	}else {
        		end += count;
        		cut(sourcefile, "E:\\record-cut_" + start + "_" + end +".wav", start, end);
        		start += count;
        		internal = newTime - end;
        	}
        }

	}

	 /**
     * 截取wav音频文件
     * @param sourcepath  源文件地址
     * @param targetpath  目标文件地址
     * @param start  截取开始时间(秒)
     * @param end  截取结束时间(秒)
     *
     * return  截取成功返回true,否则返回false
     */
    public static boolean cut(String sourcefile, String targetfile, int start, int end) {
        try{
            if(!sourcefile.toLowerCase().endsWith(".wav") || !targetfile.toLowerCase().endsWith(".wav")){
                return false;
            }
            File wav = new File(sourcefile);
            if(!wav.exists()){
                return false;
            }
            long 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 = (wavSize/t1)*(end-start);  //截取的音频数据大小
            long skipSize = (wavSize/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();
        }catch(IOException e){
            e.printStackTrace();
            return false;
        }
        return true;
    } 

    /**
     * 获取音频文件总时长
     * @param filePath  文件路径
     * @return
     */
    public static long getTimeLen(File file){
        long tlen = 0;
        if(file!=null && file.exists()){
            Encoder encoder = new Encoder();
            try {
                 MultimediaInfo m = encoder.getInfo(file);
                 long 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;
     }  

}

  

 切割后的效果

原文地址:https://www.cnblogs.com/Donnnnnn/p/10684213.html

时间: 2024-11-06 09:48:12

java切割音频文件的相关文章

java获取音频文件播放时长

方法一: 在项目开发过程中,需要获取音视频文件时长.查询资料后发现 JAVE能够完美得到想要的结果,JAVE项目简介如下: The JAVE (Java Audio Video Encoder) library is Java wrapper on the ffmpeg project. Developers can take take advantage of JAVE to transcode audio and video files from a format to another. I

使用第三方Java类库jaudiotagger完成Flac音频文件metadata(元数据)的读和修改

最近需要使用Java Swing做个读写Flac格式音频文件的小GUI工具,虽然Mp3tag完全可以完成Flac的读写(编辑)任务,但是为了简化工作流程(编辑Flac信息后调用其它系统的接口完成部分信息上传等功能),需要开发一个集成类似Mp3tag功能和额外功能于一体的小工具. 开发前的思考~~,"用JDK提供的IO(NIO)读写Flac?...","Flac的格式?...","一直潜心于JavaWeb和服务端接口开发...几乎没做过Java的GUI(Sw

[Java Swing 大富翁]Java常用的文件、图片、音频 ===通用工具类

/** * 该类用于处理项目资源的工具类 * <p> * 要注意的是:项目资源必须要放到工程目录src下,也可以应用项目外部资源需指明绝对路径 */ public class FileUtil { //项目文件必须位于src目录下的下列3个子文件夹之一 private static final String FILE = "file/"; //存放普通文件 private static final String IMAGE = "images/"; //

Android音频文件浏览+音频播放

该Demo运行后,会显示所有你sd卡上的音乐文件列表, 并可以点击列表选择某一首歌曲进行播放. 运行效果: 点击download出现: 然后点击歌曲调用系统播放器播放. 源代码: activity_audio_browser.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tool

android开发:把一个byte数组转换成wav音频文件,并且播放

============问题描述============ 如题,byte数组转换成wav音频文件,并且播放,下面代码能生成data/data/com.example.playwav/cache/temp.wav 但是在播放的时候报异常. 我把代码和Log贴在下面了. 我分析,原因应该是wav文件格式的编解码问题,不能这么随随便便把任意的一个byte数组就转化为了wav 希望了解wav编解码开发的童鞋给点解决办法 byte[] a = { 52, 51, 48, 28, 58, 64, 98,-1

Android 加密/解密音频文件(AES)

加密过程:以byte[]形式读取SD卡上准备好的测试音频文件,使用AES加密算法加密byte[],再保存覆盖原音频文件,此时加密后的音频文件无法被播放.解密和加密过程原理一样,解密保存后的音频文件可以被播放. 代码: VoiceEncryptionActivity.java package com.example.voiceencryption; import java.io.File; import java.io.FileInputStream; import java.io.FileNot

【Android开发经验】如何获取媒体库中所有音频文件信息,并在文件增删后及时更新媒体库(转)

转载请注明出处: http://blog.csdn.net/zhaokaiqiang1992 今天一打开博客,发现一位朋友给我发了一封私信,请教下面的问题,所以特写此文章,为其解惑. 从这位朋友的提问中,我们需要了解下面的这些问题,才能给他很好的解答: (1)如何获取手机里所有歌曲的信息? (2)在歌曲文件发生改变,比如增删操作之后,如何及时的更新媒体库,从而获取到最新的歌曲信息? (3)在4.4版本之后,扫描sd卡,更新媒体库的操作发生变化了吗? 下面,我将就以上三个问题,进行解答. (1)如

用java流方式判断文件类型

这个方法只能在有限的范围内有效.并不是万金油 比如 图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断. 下面给出完整版代码 首先是文件类型枚取 package org.filetype; /** * 文件类型枚取 */ public enum FileType { /** * JEPG. */ JPEG("FFD8FF"), /** * PNG. */ PNG("89504E47"), /** * GIF. */ GIF(

Java基础之文件IO

概述 Java 的 I/O 操作类在包 java.io 下,大概有将近 80 个类,但是这些类大概可以分成四组,分别是: 按处理数据类型来分:字节流和字符流: 基于字节操作的 I/O 接口:InputStream 和 OutputStream 基于字符操作的 I/O 接口:Writer 和 Reader 按传输数据的方式:磁盘操作和网络操作 基于磁盘操作的 I/O 接口:File 基于网络操作的 I/O 接口:Socket 按流的方向来分:输入流和输入流 要读的话就用输入流,要写的话,就用输出流