Java通過Javacv,FFmpeg對音頻進行剪輯


在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM