Java通過Javacv,FFmpeg對音訊進行剪輯
阿新 • • 發佈:2020-11-01
在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