java利用wsschildjave-core273对音频、视频文件进行剪辑保留源文件的格式码率等原始信息的通时支持只传开始时间截取到最后只传结束时间从头开始剪传开始时间+截取时长传开始时间和结束时间这四种组合方式进行剪辑
首先,需要添加依赖:
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-core</artifactId>
<version>2.7.3</version>
</dependency>
然后,可以定义一个 Clipper 类来进行剪辑操作:
import ws.schild.jave.*;
import java.io.File;
public class Clipper {
public static void clip(File source, File target, Long startTime, Long endTime) throws EncoderException {
MultimediaObject multimediaObject = new MultimediaObject(source);
MultimediaObject result;
if (startTime != null && endTime != null) {
// 剪辑指定时间段
result = new MultimediaObject(multimediaObject.getInfo(), target);
result.crop(startTime, endTime);
} else if (startTime != null) {
// 从指定时间开始剪辑到最后
long duration = multimediaObject.getInfo().getDuration() - startTime;
result = new MultimediaObject(multimediaObject.getInfo(), target);
result.crop(startTime, duration);
} else if (endTime != null) {
// 从头开始剪辑到指定时间
result = new MultimediaObject(multimediaObject.getInfo(), target);
result.crop(0L, endTime);
} else {
// 不进行剪辑,直接复制文件
multimediaObject.save(target);
return;
}
// 保留源文件的格式、码率等原始信息
AudioAttributes audioAttributes = new AudioAttributes();
audioAttributes.setCodec(multimediaObject.getInfo().getAudio().getCodec());
audioAttributes.setBitRate(multimediaObject.getInfo().getAudio().getBitRate());
audioAttributes.setChannels(multimediaObject.getInfo().getAudio().getChannels());
audioAttributes.setSamplingRate(multimediaObject.getInfo().getAudio().getSamplingRate());
VideoAttributes videoAttributes = new VideoAttributes();
videoAttributes.setCodec(multimediaObject.getInfo().getVideo().getCodec());
videoAttributes.setBitRate(multimediaObject.getInfo().getVideo().getBitRate());
videoAttributes.setFrameRate(multimediaObject.getInfo().getVideo().getFrameRate());
videoAttributes.setSize(multimediaObject.getInfo().getVideo().getSize());
EncodingAttributes encodingAttributes = new EncodingAttributes();
encodingAttributes.setFormat(multimediaObject.getInfo().getFormat());
encodingAttributes.setAudioAttributes(audioAttributes);
encodingAttributes.setVideoAttributes(videoAttributes);
Encoder encoder = new Encoder();
encoder.encode(result, target, encodingAttributes);
}
}
可以看到,Clipper 类中定义了一个 clip 方法,接受四个参数:
source:源文件target:剪辑后的目标文件startTime:开始时间(可选)endTime:结束时间(可选)
根据传入的参数,clip 方法会进行相应的剪辑操作:
- 如果同时传入了
startTime和endTime,则会剪辑指定时间段; - 如果只传入了
startTime,则会从指定时间开始剪辑到最后; - 如果只传入了
endTime,则会从头开始剪辑到指定时间; - 如果没有传入
startTime和endTime,则不进行剪辑,直接复制文件。
剪辑完成后,会保留源文件的格式、码率等原始信息,然后保存到目标文件中。
下面是一个使用示例:
import ws.schild.jave.EncoderException;
import java.io.File;
public class Main {
public static void main(String[] args) throws EncoderException {
File source = new File("input.mp4");
File target = new File("output.mp4");
// 剪辑指定时间段
Clipper.clip(source, target, 10000L, 20000L);
// 从指定时间开始剪辑到最后
Clipper.clip(source, target, 10000L, null);
// 从头开始剪辑到指定时间
Clipper.clip(source, target, null, 20000L);
// 不进行剪辑,直接复制文件
Clipper.clip(source, target, null, null);
}
}
这个示例演示了四种不同的剪辑方式。其中,源文件为 input.mp4,剪辑后的文件保存为 output.mp4
原文地址: https://www.cveoy.top/t/topic/hbZR 著作权归作者所有。请勿转载和采集!