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