2016-05-23 4 views
0

Я хочу объединить больше WAV-файлов в моем приложении в один файл WAV. Но я не хочу объединять их последовательно (например, File1-File2-File3 ...), но все файлы должны запускаться одновременно (одновременно/одновременно).Android - объединить (объединить) два или более файла WAV в один (смешать) одновременно

Возможно ли это на Android без использования некоторых туземных библиотек (например, FFmpeg)? Я посмотрел на AudioTrack и SoundPool, но я думаю, что это не решение этой проблемы.

Также я нашел это сообщение Android: How to mix 2 audio files and reproduce them with soundPool, но как я могу объединить байты из более WAV-файлов?

ответ

0

Если вы используете AudioTrack или SoundPool, вы не сможете точно синхронизировать игру и, скорее всего, это будет легко услышать. Другая проблема заключается в том, что ваши файлы могут иметь разный уровень звука, и, таким образом, более мягкие будут замаскированы более громкими (подумайте о том, чтобы играть поп-трек поверх куска мягкой классической музыки). Возможно, вам потребуется нормализовать уровни входных звуковых файлов.

Для точного слияния и нормализации в одно и то же время вам необходимо микшировать содержимое звука самих файлов, а затем воспроизводить полученный результат. Вам нужно будет прочитать файлы .wav самостоятельно как двоичные потоки, так как в Android отсутствует класс Java AudioInputStream, который может сделать это проще. Смотрите это как пример того, как сделать это с основными классами IO:

https://thiscouldbebetter.wordpress.com/2011/08/14/reading-and-writing-a-wav-file-in-java/

Теперь у вас есть звуковые данные в виде массива short целых чисел. Этот ответ описывает, как преобразовать данные образцы из целого числа в плавающей точкой и объединить два звуковых потоков, в то время нормализации их уровня звука:

https://stackoverflow.com/a/32023546/4477684

Для того, чтобы объединить более, что два звуковых входов, начать с объединения двух, и затем объединить результат с третьим входом и т. д.

+0

Спасибо за ваш ответ! Я думаю, что легкое решение для этого не будет существовать на Android. Вы знаете библиотеку FFmpeg? Возможно ли использовать эту библиотеку (с некоторыми параметрами) для этого (слияние и нормализация)? –

+0

Прежде всего, ffmpeg - это родная библиотека, и я бы предложил подумать дважды, прежде чем добавлять собственный код в ваше приложение. На Android, если что-то можно сделать с Java, и производительность приемлема, лучше придерживаться этого. С ffmpeg (его частью libswresample), безусловно, возможно объединить аудиопотоки, но похоже, что молоток слишком большой. Вы можете попробовать использовать интерфейс командной строки ffmpeg, чтобы прототип своего решения. Здесь люди обсуждают, как объединить многоканальное аудио с помощью ffmpeg, может быть хорошей отправной точкой: http://ffmpeg.gusari.org/viewtopic.php?f=11&t=2502 –