音频拼接,就是5s+5s=10s的这种拼接。
需要修改的地方都是有三处,在代码里标注好了。
一、Python实现:
Python3
#!/usr/bin/env python # -*- coding:utf-8 -*- # ok,音频拼接 from pydub import AudioSegment # 先导入这个模块 # 加载需要合并的两个mp3音频 parameters = None input_music_1 = AudioSegment.from_mp3("D:/4.mp3") #需要修改的地方:音频1 input_music_2 = AudioSegment.from_mp3("D:/5.mp3")#需要修改的地方:音频2 #获取两个音频的响度(音量) input_music_1_db = input_music_1.dBFS input_music_2_db = input_music_2.dBFS # 获取两个音频的时长,单位为毫秒 input_music_1_time = len(input_music_1) input_music_2_time = len(input_music_2) # 调整两个音频的响度一致 # 合并音频 output_music = input_music_1 + input_music_2 # 简单输入合并之后的音频 output_music.export("D:/output_music.mp3", format="mp3")# 前面是保存路径,后面是保存格式 #复杂输入合并之后的音频 # bitrate:比特率,album:专辑名称,artist:歌手,cover:封面图片 #需要修改的地方:输出音频。cover那个没用着,可以删掉。 output_music.export("D:/output_music.mp3", format="mp3", bitrate="192k", tags={"album": "专辑", "artist": "歌手"}, cover="D:/1.jpg") print(len(output_music), output_music.channels)# 合并音频的时长,音频的声道,1是单声道,2是立体声
二、java实现
1、第一种
package com.fish; //ok,也是拼接!!! import java.io.*; import java.util.*; public class Test { public static void main(String[] args) throws Exception { String s = "D:/out.mp3"; // 输出目录 & 文件名 List<String> list = new ArrayList<String>(); File dir = new File("D:/aaa"); // 把两个mp3文件放在这个文件夹下面。这是要遍历的目录, 用递归拿文件,. recursion(dir.listFiles(), list); // 递归函数 String[] ss = new String[list.size()]; for (int i = 0; i < ss.length; i++) { ss[i] = list.get(i); } System.out.println(); combine(s, ss); } public static void recursion(File[] fs, List<String> list) // 递归得所有子目录的.mp3文件. { for (File f : fs) { if (f.isDirectory()) { recursion(f.listFiles(), list); } else { if (f.getName().endsWith(".mp3")) { list.add(f.getAbsolutePath()); } } } } private static boolean combine(String outFile, String[] inFiles) throws Exception { File out = new File(outFile); File[] files = new File[inFiles.length]; for (int i = 0; i < files.length; i++) { files[i] = new File(inFiles[i]); } FileInputStream fis = null; FileOutputStream fos = new FileOutputStream(outFile, true); // 合并其实就是文件的续写,写成true for (int i = 0; i < files.length; i++) { fis = new FileInputStream(files[i]); int len = 0; for (byte[] buf = new byte[1024 * 1024]; (len = fis.read(buf)) != -1;) { fos.write(buf, 0, len); } } fis.close(); fos.close(); return true; } }
2、第二种
package com.fish; //ok,又是音频拼接! /** * @Classname Test2 * @Description TODO * @Data 2020/4/8 22:11 * @Created by Amy */ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class Test2 { public static void main(String args[]) throws Exception{ File f1 = new File("D:/4.mp3"); File f2 = new File("D:/5.mp3"); File f3 = new File("D:/8.mp3");//输出音频 FileInputStream inpu1 = new FileInputStream(f1); FileInputStream inpu2 = new FileInputStream(f2); FileOutputStream out = new FileOutputStream(f3); byte b[] = new byte[1024]; int len=0; //把f1的内容流到f3中 while ((len = inpu1.read(b))!= -1) { for(int i = 0;i < len;i++) { out.write(b[i]); } } inpu1.close(); //在刚才的后面流f2到f3中 while ((len = inpu2.read(b))!= -1) { for(int i = 0;i<len;i++){ out.write (b[i]); } } System.out.println("合并完成"); out.write(b); inpu2.close(); out.close(); } }
-----------------------------------------------------------------------------------
这几天因为写论文做作业什么的,写博客都不爱叨逼叨了= =