音频拼接,就是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();
}
}
-----------------------------------------------------------------------------------
这几天因为写论文做作业什么的,写博客都不爱叨逼叨了= =