当前位置:   article > 正文

javacv FFmpeg 剪辑音频文件

javacv FFmpeg 剪辑音频文件

需要对mp3文件进行剪辑,剪掉几秒到几秒,然后生成新的文件。

     目前有两种方法,

                方法一、是用脚本+安装FFmpeg执行包,

                方法二、不需要安装FFmpeg,直接调用ffmpeg包解码。

本文介绍的为方法二,不需要下载安装FFmpeg.

1、maven 需要添加2个依赖

        javacv  和 ffmpeg-platform 都是org.bytedeco,这两个版本要匹配

  1. <dependency>
  2. <groupId>org.bytedeco</groupId>
  3. <artifactId>javacv</artifactId>
  4. <version>1.5.6</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.bytedeco</groupId>
  8. <artifactId>ffmpeg-platform</artifactId>
  9. <version>4.4-1.5.6</version>
  10. </dependency>

2、写个测试类

  1. public class Mp3Cutter {
  2. public static void main(String[] args) {
  3. // 输入音频文件和输出音频文件路径
  4. String inputFile = "F:\\temp\\欢乐谷.mp3";
  5. String outputFile = "F:\\temp\\mp3_out.mp3";
  6. cutAudio(inputFile, outputFile);
  7. }
  8. public static void cutAudio(String inputFile, String outputFile) {
  9. try {
  10. // 创建 FFmpegFrameGrabber 以读取输入音频文件
  11. FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
  12. int bitrate=grabber.getAudioBitrate();
  13. int sampleRate=grabber.getSampleRate();
  14. // 创建 FFmpegFrameRecorder 以写入输出音频文件
  15. FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 2);
  16. recorder.setAudioCodec(grabber.getAudioCodec());
  17. recorder.setAudioQuality(0);
  18. recorder.setAudioBitrate(64000);//比特,中等效果
  19. recorder.setAudioChannels(2);//grabber.getAudioChannels());
  20. recorder.setSampleRate(44100);//grabber.getSampleRate());
  21. recorder.setAudioOption("crf", "0");
  22. recorder.start();
  23. grabber.start();
  24. //这个顺序要在后面
  25. Frame f;
  26. int total=0;
  27. //计算音频样本帧的数量
  28. while((f=grabber.grabSamples())!=null)
  29. {
  30. total++;
  31. }
  32. //设置要剪辑掉的 18秒--30秒
  33. long startSec=18;
  34. long endSec=startSec+12;
  35. //计算时长
  36. long durationInSec = grabber.getFormatContext().duration() / 1000000;
  37. //设置要剪辑掉的 倒数50秒--60秒
  38. long startSec2=durationInSec-50;
  39. if(durationInSec<=140) {
  40. startSec2=durationInSec-45;
  41. }
  42. long endSec2=startSec2+10;
  43. //按比例计算开始录入的帧
  44. int startFrameNum = getStartOrEndFrameNumber(startSec, durationInSec, total);
  45. int endSecFN=getStartOrEndFrameNumber(endSec, durationInSec, total);
  46. int startFrameNum2=getStartOrEndFrameNumber(startSec2, durationInSec, total);
  47. int endSecFN2=getStartOrEndFrameNumber(endSec2, durationInSec, total);
  48. System.out.println("时长:"+durationInSec+",20秒的帧数:"+startFrameNum+"--"+endSecFN+";"+startFrameNum2+"--"+endSecFN2);
  49. //输出剪辑的开始时间,时长,总共帧数量,开始记录的帧位置
  50. // System.out.println("Start second at {}'s,the duration is {}'s,Total Frame - {},Start frame number - {}", startSec,
  51. // durationInSec, total, startFrameNum);
  52. int i = 0;
  53. //再次读取
  54. grabber.restart();
  55. while ((f = grabber.grabSamples()) != null) {
  56. //略过不需要记录的帧,只从需要的帧位置开始记录
  57. if (i > startFrameNum&&i<endSecFN) {
  58. i++;
  59. System.out.print(".");
  60. continue;
  61. }
  62. if (i > startFrameNum2&&i<endSecFN2) {
  63. i++;
  64. continue;
  65. }
  66. i++;
  67. recorder.record(f);
  68. }
  69. // 关闭资源
  70. grabber.stop();
  71. recorder.stop();
  72. } catch (Exception e) {
  73. e.printStackTrace();
  74. }
  75. }
  76. public static int getStartOrEndFrameNumber(long startOrEndAtSecond, long durationInSecond, int totalFrame) {
  77. if (startOrEndAtSecond >= durationInSecond)
  78. return (int) durationInSecond;
  79. double percent = startOrEndAtSecond / (double) durationInSecond;
  80. return (int) Math.round(totalFrame * percent);
  81. }
  82. }

运行测试。上面的代码可以直接跑。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/213340
推荐阅读
相关标签
  

闽ICP备14008679号