如何混合/覆盖两款MP3音频文件分割成一个MP3文件(而不是串联)(How to mix / ove

2019-07-27 23:10发布

我想两个mp3文件合并成一个MP3 file.for例如,如果第一个文件是1分钟和第2档为30秒,那么输出应该是1分钟。 在一个分应该发挥这两个文件。

Answer 1:

首先, 为了搭配你需要操纵他们的原始表示两个音频文件 ; 由于MP3文件被压缩 ,您不必为信号的原始表示的直接访问。 你需要压缩的MP3流,以“了解”您的音频信号的波形进行解码,然后你就可以将它们混合。

因此,为了混合两种压缩音频文件到一个单一的压缩音频文件,需要以下步骤:

  1. 解码使用解码器,以获得原始数据的压缩文件( 用于此没有公共系统API,你需要做手工!)。
  2. 混合两个原始未压缩的数据流(如果需要的话将音频削波 )。 对于这一点,你需要考虑你的解码器 (获得的原始数据格式PCM )
  3. 编码原料混合数据转换成压缩的MP3文件(根据解码器,则需要做它使用编码器手动地)

更多信息阿布德MP3解码器,可以发现在这里 。



Answer 2:

我不知道,如果你想这样做在Android手机上(貌似是因为你的代码),但如果我是对的也许尝试LoopStack ,它是一个移动DAW(没有尝试自己)。

如果你只是“混合”两个文件,无需调整输出音量您的输出可能夹。 但是我不知道是否有可能进行“混合”两个mp3文件无需解码他们。

如果它是好的,你来合并它们在PC上尝试Audacity的 ,这是一个免费的桌面DAW。



Answer 3:

我没有做过的Android,但我已经使用Adobe Flex做到了。 我猜的逻辑是一样的。 我跟着下面的步骤:

  • 我抽出两个MP3歌曲到两个字节数组。 ( song1ByteArraysong2ByteArray
  • 找出更大的字节数组。 (比方说song1ByteArray是较大的一个)。
  • 创建它返回混合字节数组的函数。

     private ByteArray mix2Songs(ByteArray song1ByteArray, ByteArray song2ByteArray){ int arrLength=song1ByteArray.length; for(int i=0;i<arrLength;i+=8){ // here if you see we are incrementing the length by 8 because a sterio sound has both left and right channels 4 bytes for left +4 bytes for right. // read left and right channel values for the first song float source1_L=song1ByteArray.readFloat();// I'm not sure if readFloat() function exists in android but there will be an equivalant one. float source1_R=song1ByteArray.readFloat(); float source2_L=0; float source2_R=0; if(song2ByteArray.bytesAvailable>0){ source2_L=song1ByteArray.readFloat();//left channel of audio song2ByteArray source2_R=song1ByteArray.readFloat(); //right channel of audio song2ByteArray } returnResultArr.writeFloat((source_1_L+source_2_L)/2); // average value of the source 1 and 2 left channel returnResultArr.writeFloat((source_1_R+source_2_R)/2); // average value of the source 1 and 2 right channel } return returnResultArr; } 


Answer 4:

1. 邮政音频在Android中混合

2. 在Android的混合音频另一篇文章

3.你可以充分利用Java声音混合两个音频文件

例:


// First convert audiofile to audioinputstream

audioInputStream = AudioSystem.getAudioInputStream(soundFile);
audioInputStream2 = AudioSystem.getAudioInputStream(soundFile2);

// Create one collection list object using arraylist then add all AudioInputStreams

Collection list=new ArrayList();
list.add(audioInputStream2);
list.add(audioInputStream);

// Then pass the audioformat and collection list to MixingAudioInputStream constructor

MixingAudioInputStream mixer=new MixingAudioInputStream(audioFormat, list); 

// Finally read data from mixed AudionInputStream and give it to SourceDataLine

nBytesRead =mixer.read(abData, 0,abData.length);

int nBytesWritten = line.write(abData, 0, nBytesRead);

4.尝试AudioConcat具有-m混合选项


java AudioConcat [ -D ] [ -c ] | [ -m ] | [ -f ] -o outputfile inputfile ...

Parameters. 

-c
selects concatenation mode

-m
selects mixing mode

-f
selects float mixing mode

-o outputfile
The filename of the output file

inputfile
the name(s) of input file(s)

5.你可以使用ffmpeg的机器人包装用的语法和方法,因为解释这里



Answer 5:

这家伙用的JLayer库非常类似你的项目。 他还提供了关于如何到图书馆在你的Android应用程序直接重新编译的jar整合的指导。

复述他的代码是很容易完成你的任务:

public static byte[] decode(String path, int startMs, int maxMs) 
  throws IOException, com.mindtherobot.libs.mpg.DecoderException {
  ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024);

  float totalMs = 0;
  boolean seeking = true;

  File file = new File(path);
  InputStream inputStream = new BufferedInputStream(new FileInputStream(file), 8 * 1024);
  try {
    Bitstream bitstream = new Bitstream(inputStream);
    Decoder decoder = new Decoder();

    boolean done = false;
    while (! done) {
      Header frameHeader = bitstream.readFrame();
      if (frameHeader == null) {
        done = true;
      } else {
        totalMs += frameHeader.ms_per_frame();

        if (totalMs >= startMs) {
          seeking = false;
        }

        if (! seeking) {
          SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);

          if (output.getSampleFrequency() != 44100
              || output.getChannelCount() != 2) {
            throw new com.mindtherobot.libs.mpg.DecoderException("mono or non-44100 MP3 not supported");
          }

          short[] pcm = output.getBuffer();
          for (short s : pcm) {
            outStream.write(s & 0xff);
            outStream.write((s >> 8 ) & 0xff);
          }
        }

        if (totalMs >= (startMs + maxMs)) {
          done = true;
        }
      }
      bitstream.closeFrame();
    }

    return outStream.toByteArray();
  } catch (BitstreamException e) {
    throw new IOException("Bitstream error: " + e);
  } catch (DecoderException e) {
    Log.w(TAG, "Decoder error", e);
    throw new com.mindtherobot.libs.mpg.DecoderException(e);
  } finally {
    IOUtils.safeClose(inputStream);     
  }
}

public static byte[] mix(String path1, String path2) {
    byte[] pcm1 = decode(path1, 0, 60000); 
    byte[] pcm2 = decode(path2, 0, 60000);
    int len1=pcm1.length; 
    int len2=pcm2.length;
    byte[] pcmL; 
    byte[] pcmS;
    int lenL; // length of the longest
    int lenS; // length of the shortest
    if (len2>len1) {
        lenL = len1;
        pcmL = pcm1;
        lenS = len2;                
        pcmS = pcm2;
    } else {
        lenL = len2;
        pcmL = pcm2;
        lenS = len1;                
        pcmS = pcm1;
    } 
    for (int idx = 0; idx < lenL; idx++) {
        int sample;
        if (idx >= lenS) {
            sample = pcmL[idx];
        } else {
            sample = pcmL[idx] + pcmS[idx];
        }
        sample=(int)(sample*.71);
        if (sample>127) sample=127;
        if (sample<-128) sample=-128;
        pcmL[idx] = (byte) sample;
    }
    return pcmL;
}

请注意,我说的衰减和限幅在最后一行:你总是要做到既混合两种波形时。 如果你没有内存/时间要求,你可以做一个int []样本的总和,并评估哪些是避免削波的最佳衰减。



Answer 6:

要合并(重叠)两个声音文件,您可以使用此FFMPEG库 。

这里是文档

在他们的样品只需输入你想要的命令。 所以让我们谈谈我们所需要的命令。

-i [FISRST_FILE_PATH] -i [SECOND_FILE_PATH] -filter_complex amerge -ac 2 -c:a libmp3lame -q:a 4 [OUTPUT_FILE_PATH]

对于第一和第二文件路径,你会得到的声音文件的绝对路径。 1-如果它是存储那么它是用于子文件夹Environment.getExternalStorageDirectory().getAbsolutePath()

2 -如果它是资产,所以它应该是一个子文件夹中file:///android_asset/

对于输出路径,确保添加扩展名前。

String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/File Name.mp3"


Answer 7:

我没有得到任何罚款solution.but我们可以在这里做一些窍门.. :)你可以同时拥有MP3文件分配给两个不同的MediaPlayer object.then同时具有button.compare玩这两个文件都mp3文件找到使用一个AudioReorder最长duration.after记录到的持续时间。 这将解决您的problem..I知道它不是一个正确的做法,但希望它会帮助你.. :)



文章来源: How to mix / overlay two mp3 audio file into one mp3 file (not concatenate)