项目使用的是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");
}