Java 利用ffmpeg 分割wav音频文件

该文章介绍了一种在Java中使用jave库和ffmpeg命令行工具来分割wav音频文件的方法。在遇到使用jave分割后文件无法播放的问题后,作者转向使用ffmpeg,通过设置切割起点和终点,成功实现了wav文件的分割。代码示例展示了如何在Java中调用ffmpeg命令进行操作。
摘要由CSDN通过智能技术生成

由于项目需要,需要分割wav文件,看了网上的使用“jave”分割,测试后,发现分割后的wav文件无法播放,后续测试使用中间程序:ffmpeg

下载ffmpeg,配置好系统环境变量后
在这里插入图片描述
确保可以使用该命令。

Java代码


import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.MultimediaInfo;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 
 * @program 
 * @description
 * @create 2023/2/8 14:31
 **/
public class FfmpegWav {

    /**
     * 音频切割
     *
     * @param path 路径
     * @param fileName 文件名
     * @param timeLong 切割时长
     * @return 返回切割后文件列表
     */
    public static List<String> wavToCutting(String path, String fileName, int timeLong) {
        Runtime run = null;
        List<String> result = new ArrayList<>();
        try {
            long start = System.currentTimeMillis();
            // 获取录音时长
            File file = new File(path + fileName);
            if (!file.exists()) {
                return null;
            }
            int audioLength = (int) getTimeLen(file);
            System.out.println("录音时长:" + audioLength);
            int startTime = 0;
            int endTime = 0;
            run = Runtime.getRuntime();
            while (endTime < audioLength) {
                endTime += timeLong;
                if (endTime > audioLength) {
                    endTime = audioLength;
                }
                String cutFile = (path + fileName.replace(".wav", "") + "_cut_" + startTime + "_" + endTime + ".wav");
                String runCmd = "ffmpeg -i " + (path + fileName) + " -ss " + secondToTime(startTime) + " -to " + secondToTime(endTime)
                        + " -y " + cutFile;
                Process p = run.exec(runCmd);

                System.out.println("执行:" + runCmd);
                result.add(cutFile);
                startTime = endTime;
            }
            long end = System.currentTimeMillis();
            System.out.println(" 分割耗时:" + (end - start)/1000 + "秒");
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // run调用lame解码器最后释放内存
            assert run != null;
            run.freeMemory();
        }
        return result;
    }

    /**
     * 获取音频文件总时长
     *
     * @param file 文件
     * @return
     */
    public static long getTimeLen(File file) {
        long result = 0;
        if (file != null && file.exists()) {
            Encoder encoder = new Encoder();
            try {
                MultimediaInfo m = encoder.getInfo(file);
                long ls = m.getDuration();
                result = ls / 1000;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }


    /**
     * 整数秒转换,精确到秒
     *
     * @param seconds
     * @return
     */
    private static String secondToTime(int seconds) {
        if (seconds < 0) {
            throw new IllegalArgumentException("Seconds must be a positive number!");
        } else {
            int hour = seconds / 3600;
            int other = seconds % 3600;
            int minute = other / 60;
            int second = other % 60;
            StringBuilder sb = new StringBuilder();
            if (hour < 10) {
                sb.append("0");
            }
            sb.append(hour);
            sb.append(":");
            if (minute < 10) {
                sb.append("0");
            }
            sb.append(minute);
            sb.append(":");
            if (second < 10) {
                sb.append("0");
            }
            sb.append(second);
            return sb.toString();
        }
    }

    public static void main(String[] args) {
        System.out.println(wavToCutting("D:/softdata/projectRunData/wav/", "test.wav", 59));
    }
}

maven依赖


        <!-- https://mvnrepository.com/artifact/com.github.dadiyang/jave -->
        <dependency>
            <groupId>com.github.dadiyang</groupId>
            <artifactId>jave</artifactId>
            <version>1.0.5</version>
        </dependency>

切割结果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我想出去玩-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值