zoukankan      html  css  js  c++  java
  • 音频拼接的简单实现方法(python一种,java两种)

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

     

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

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

  • 相关阅读:
    Application package 'AndroidManifest.xml' must have a minimum of 2 segments.
    让“是男人就下到100层”在Android平台上跑起来
    移植一个cocos2d-x游戏
    cocos2d-x宏定义
    职场之需求
    cocos2d-x for android配置 & 运行 Sample on Linux OS
    input函数出现的问题(Python)
    职场之英语
    职场之随手记
    应用商店后台MIS的一些思考
  • 原文地址:https://www.cnblogs.com/Amy-is-a-fish-yeah/p/12670092.html
Copyright © 2011-2022 走看看