在Java中,我们可以通过Javacv提供的FFmpeg等工具类,对音频从开始位置剪切
具体实现步骤为:
1.计算音频有多少样本帧,以及音频时长
2.输入剪辑的起始时间
3.计算起始时间在总时长中的占比,计算出需要记录样本帧的开始数目
比如,时长为60秒,帧数量为6000帧,需要从第6秒开始剪辑,第六秒与总时长的比值为0.1,则开始记录的帧应该是6000*0.1=600帧
代码如下:
public void cutAudioFromStart(int startSec) { //样本视频 String audioOne = "sample.mp3"; //剪辑以后的视频 String cutStartAudio="cutStart.mp3"; try { //生成 帧recorder FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(cutStartAudio, 2); recorder.setAudioOption("crf", "0"); recorder.setAudioQuality(0); //设置比特率 recorder.setAudioBitrate(192000); //设置采样率 recorder.setSampleRate(44100); //设置声道 recorder.setAudioChannels(2); //设置编码格式 recorder.setAudioCodec(avcodec.AV_CODEC_ID_MP3); recorder.start(); //加载样本音频 FFmpegFrameGrabber grabberOne = FFmpegFrameGrabber.createDefault(audioOne); grabberOne.start(); Frame f; int total=0; //计算音频样本帧的数量 while((f=grabberOne.grabSamples())!=null) { total++; } //计算时长 long durationInSec = grabberOne.getFormatContext().duration() / 1000000; //按比例计算开始录入的帧 int startFrameNum = getStartOrEndFrameNumber(startSec, durationInSec, total); //输出剪辑的开始时间,时长,总共帧数量,开始记录的帧位置 LOGGER.info("Start second at {}'s,the duration is {}'s,Total Frame - {},Start frame number - {}", startSec, durationInSec, total, startFrameNum); int i = 0; //再次读取 grabberOne.restart(); while ((f = grabberOne.grabSamples()) != null) { //略过不需要记录的帧,只从需要的帧位置开始记录 if (i < startFrameNum) { i++; continue; } recorder.record(f); } recorder.close(); grabberOne.close(); LOGGER.info(cutStartAudio); } catch (Exception e) { LOGGER.error("",e); } } public static int getStartOrEndFrameNumber(long startOrEndAtSecond, long durationInSecond, int totalFrame) { if (startOrEndAtSecond >= durationInSecond) return (int) durationInSecond; double percent = startOrEndAtSecond / (double) durationInSecond; return (int) Math.round(totalFrame * percent); }
该文转自: 烂代码网
https://trashcode.cn/post/d/7330327e-6118-48a1-96e8-cd990effe91b