使用javacv进行语音文件分割

项目使用的是maven,项目用的一些依赖如下:

<!--音频包-->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp</artifactId>
            <version>1.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>opencv-platform</artifactId>
            <version>3.4.1-1.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg-platform</artifactId>
            <version>3.4.2-1.4.1</version>
        </dependency>

文件切割的代码:这里文件切割后的一些参数都和源文件一样,需要不一样的可以直接代码更改,如采样率和编码格式

	// 文件截取
    public static void splitFile(String inputFile, String outputPath, String suffix) {
        //  使用javacv的FFmpeg的相关工具包
        // 创建文件抓取器
        /*FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
        //grabber.setOption("RW_TIMEOUT", "20000000");
        Frame audioSamples = null;  // 默认音频是pcm采样数据
        // 输出文件
        if (start(grabber)) {
            // 时间长度,微秒
            long lengthInTime = grabber.getLengthInTime();
            System.out.println("lengthInTimeU:" + lengthInTime / 1000000);
            System.out.println("lengthInTime:" + lengthInTime);
            double b = (lengthInTime / 1000000) / 20;
            // 小文件个数
            int count = (int) Math.ceil(b);
            long timeout = 20000000;
            long counttimestamp = 0;
            for (int i = 0; i <= count; i++) {
                String startZeroStr = String.format("%06d", i);// 补零
                FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputPath + "split_" + startZeroStr + "." + suffix, 1);
                int audioChannels = grabber.getAudioChannels();// 音频通道数
                int audioBitrate = grabber.getAudioBitrate();// 音频码率
                // 编码格式
                int audioCodec = grabber.getAudioCodec(); //源文件编码格式
                recorder.setAudioCodec(audioCodec); // 65543
                recorder.setAudioBitrate(audioBitrate);
                recorder.setAudioChannels(audioChannels);
                recorder.setSampleRate(grabber.getSampleRate());
                recorder.setAudioQuality(0);// 最高质量
                recorder.setAudioOption("aq", "10");
                recorder.setFrameRate(8);
                if (start(recorder)) {
                    try {
                        // 抓取音频
                        while ((audioSamples = grabber.grab()) != null) {
                            long timestamp = grabber.getTimestamp();
                            recorder.setTimestamp(timestamp);
                            //System.out.println("Timestamp:"+timestamp);
                            recorder.record(audioSamples);
                            if ((timestamp - counttimestamp) >= timeout) {
                                counttimestamp = timestamp;
                                break;
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        System.out.println(e.getCause());
                    }
                }
                stop(recorder);
                //continue;
            }
        }
        stop(grabber);*/


```java
private static boolean start(FrameGrabber grabber) {
        try {
            grabber.start();
            return true;
        } catch (org.bytedeco.javacv.FrameGrabber.Exception e2) {
            try {
                logger.error("首次打开抓取器失败,准备重启抓取器...");
                grabber.restart();
                return true;
            } catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
                try {
                    logger.error("重启抓取器失败,正在关闭抓取器...");
                    grabber.stop();
                } catch (org.bytedeco.javacv.FrameGrabber.Exception e1) {
                    logger.error("停止抓取器失败!");
                }
            }
        }
        return false;
    }

    private static boolean start(FrameRecorder recorder) {
        try {
            recorder.start();
            return true;
        } catch (FrameRecorder.Exception e2) {
            try {
                logger.error("首次打开录制器失败!准备重启录制器...");
                recorder.stop();
                recorder.start();
                return true;
            } catch (FrameRecorder.Exception e) {
                try {
                    logger.error("重启录制器失败!正在停止录制器...");
                    recorder.stop();
                } catch (FrameRecorder.Exception e1) {
                    logger.error("关闭录制器失败!");
                }
            }
        }
        return false;
    }

    private static boolean stop(FrameGrabber grabber) {
        try {
            grabber.flush();
            grabber.stop();
            grabber.close();
            return true;
        } catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
            return false;
        } finally {
            try {
                grabber.stop();
            } catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
                logger.error("关闭抓取器失败");
            }
        }
    }

    private static boolean stop(FrameRecorder recorder) {
        try {
            recorder.stop();
            recorder.release();
            recorder.close();
            return true;
        } catch (FrameRecorder.Exception e) {
            return false;
        } finally {
            try {
                recorder.stop();
            } catch (FrameRecorder.Exception e) {
                logger.error("关闭录制器失败!");
            }
        }
    }
测试:

```java
public static void main(String[] args) throws Exception {
        splitFile("d:/1/2.wav","d:/1/out","wav");
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值