音频拼接的简单实现方法(python一种,java两种)

摘要:
音频拼接,就是5s+5s=10s的这种拼接。/usr/bin/envpython#-*-coding:utf-8-*-#ok,音频拼接frompydubimportAudioSegment#先导入这个模块#加载需要合并的两个mp3音频parameters=Noneinput_music_1=AudioSegment.from_mp3#需要修改的地方:音频1input_music_2=AudioSegment.from_mp3#需要修改的地方:音频2#获取两个音频的响度(音量)input_music_1_db=input_music_1.dBFSinput_music_2_db=input_music_2.dBFS#获取两个音频的时长,单位为毫秒input_music_1_time=leninput_music_2_time=len#调整两个音频的响度一致#合并音频output_music=input_music_1+input_music_2#简单输入合并之后的音频output_music.export#前面是保存路径,后面是保存格式#复杂输入合并之后的音频#bitrate:比特率,album:专辑名称,artist:歌手,cover:封面图片#需要修改的地方:输出音频。

音频拼接,就是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();
}
}

-----------------------------------------------------------------------------------

这几天因为写论文做作业什么的,写博客都不爱叨逼叨了= =

免责声明:文章转载自《音频拼接的简单实现方法(python一种,java两种)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇怎么在iPhone手机安装测试包,并且调试APP内的H5应用redis 对 key 的操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

NODEJS文件上传

基于NodeJs的文件上传 kamiSDY 0.7612018.04.02 22:38:00字数 785阅读 19,969 最近,自己玩nodeJs,用上了Express框架,小白。上传文件,查了写资料。发现了有req.files这个接口,然后试了下。 使用req.files Express默认的上传路径为/tmp。如果是windows系统,会有报错。...

python库fire使用简介

简介 目前python命令行解析库用过的有:argparse(python自带)、click(Flask作者写的) 但二者相比fire这个库,用起来都不够 “简单”,fire一行代码能把函数导出到命令行窗口。 argparse用法示例 #arg_test.py importargparse def counter(file_type=None):...

ExtJs控件属性配置详细

Ext.form.TimeField: 配置项:maxValue:列表中允许的最大时间maxText:当时间大于最大值时的错误提示信息minValue:列表中允许的最小时间minText:当时间小于最小值时的错误提示信息increment:两个相邻选项间的时间间隔,默认为15分钟format:显示格式,默认为“g:i A”。一般使用“H:i:s”H:带前缀...

C#编程总结(八)数字签名

C#编程总结(八)数字签名 在日常工作中,有很多文件需要领导审阅、签名和盖章,由于公司业务开展,跨地域、跨国业务也日益普遍,领导签名盖章变得很麻烦,开始的时候人们通过邮寄、传真等方式来解决,但是耗费时间、人力、物力。在网络化日益深入的今天,需要领导审批、签字盖章的东西越来越多,时间也越来越紧迫,数字签名的出现,很好了解决了这一问题。推动了互联网及跨国集团的...

Linux运行python程序

reference:https://www.cnblogs.com/liunaixu/p/12804205.html 1、python-->两次Tab,出现如下图所示:显示python版本如下  2、使用gedit命令打开文本文档,输入print("hello world"),保存成p.py文件  3、运行python p.py,结果如下:  ...

elasticsearch之python备份

一:elasticsearch原理 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,...