Как объединить два mp3 файла в один (объединение/объединение)

Может ли кто-нибудь сказать, как объединить/объединить два медиафайла в один?

Я нашел темы о audioInputStream, но теперь он не поддерживается в android, и весь код для java.

И на StackOverflow я нашел эту ссылку здесь но там я не могу найти решение - эти ссылки только для потокового аудио. Кто-нибудь может мне сказать?

P.S и почему я не могу начать баунти?: (

Ответ 1

Рассмотрим два случая для файлов .mp3:

  • Файлы с одинаковой частотой дискретизации и количеством каналов

В этом случае мы можем просто добавить второй файл к концу первого файла. Это может быть достигнуто с помощью классов файлов, доступных на Android.

  • Файлы с различной частотой дискретизации или количеством каналов.

В этом случае один из клипов должен быть перекодирован, чтобы гарантировать, что оба файла имеют одинаковую частоту дискретизации и количество каналов. Для этого нам нужно будет декодировать MP3, получить образцы PCM, обработать его, чтобы изменить частоту дискретизации, а затем перекодировать в MP3. Из того, что я знаю, у андроида нет API-интерфейса для перекодирования или перекодировки. Один из вариантов - использовать внешнюю библиотеку, такую ​​как lame/FFMPEG, через JNI для повторного кодирования.

Ответ 2

import java.io.*;
public class TwoFiles
{
    public static void main(String args[]) throws IOException
    {
        FileInputStream fistream1 = new FileInputStream("C:\\Temp\\1.mp3");  // first source file
        FileInputStream fistream2 = new FileInputStream("C:\\Temp\\2.mp3");//second source file
        SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);
        FileOutputStream fostream = new FileOutputStream("C:\\Temp\\final.mp3");//destinationfile

        int temp;

        while( ( temp = sistream.read() ) != -1)
        {
            // System.out.print( (char) temp ); // to print at DOS prompt
            fostream.write(temp);   // to write to file
        }
        fostream.close();
        sistream.close();
        fistream1.close();
        fistream2.close();
    }
}