Mezclador de canciones de audio en android mediante programación

Quiero crear un mezclador de audio (pista de música DJ) tipo de aplicación que puede crear Dj mezclador de una canción de audio. El usuario puede seleccionar una pista de canción de música que se puede mezclar con dos o más pistas de ritmo, bajo o ritmo distintas para crear una nueva música de Dj modificada.

Hice un montón de investigación sobre esto, pero no pude encontrar ninguna idea o pista.

Si alguien tiene alguna idea o alguna URL de referencia con respecto a esto, comparta la información.

No hay biblioteca de compilación en Android que admita mezcla de audio (combinación de dos flujos de entrada de audio en una secuencia de salida). La biblioteca Java javax.sound que soporta la mezcla de audio no fue portada a Android – hay una interesante discusión en Grupos de Google con la ingeniera de Google Diane Hackborn sobre la decisión de no portar javax.sound a Android.

Parece que tienes que desarrollar tu propia solución desde cero. Hay varias respuestas útiles en SO sobre cómo combinar dos flujos de audio en uno:

Mezcla de archivos de audio

Edición de audio en Android

Android – Mezcla de múltiples formas de onda estáticas en un solo AudioTrack

Suena como la parte más difícil de esto sería reproducir varias pistas a la vez, y que el resto se puede hacer con la interfaz de usuario. Un enlace que podría ayudarle es Cómo jugar múltiples ogg o mp3 al mismo tiempo ..? La documentación de SoundPool, que le permite reproducir varios sonidos a la vez, se puede encontrar aquí .

 File dir; dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()); dir.mkdirs(); //Audio Mixer for two .raw file into single .wav file... void AudioMixer() { File file_play1 = new File(dir, "Neww.raw"); int shortSizeInBytes = Short.SIZE / Byte.SIZE; int bufferSizeInBytes = (int) (file_play1.length() / shortSizeInBytes); short[] audioData = new short[bufferSizeInBytes]; try { InputStream inputStream = new FileInputStream(file_play1); BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); DataInputStream dataInputStream = new DataInputStream(bufferedInputStream); InputStream inputStream1 = getResources().openRawResource(R.raw.trainss); //Play form raw folder BufferedInputStream bufferedInputStream1 = new BufferedInputStream(inputStream1); DataInputStream dataInputStream1 = new DataInputStream(bufferedInputStream1); int i = 0; while (dataInputStream.available() > 0 && dataInputStream1.available() > 0) { audioData[i] = (short) (dataInputStream.readShort() + dataInputStream1.readShort()); i++; } dataInputStream.close(); dataInputStream1.close(); AudioTrack audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM); audioTrack.write(audioData, 0, bufferSizeInBytes); //merge two .raw files in single .raw file... File file_record = new File(dir, "testing.raw"); try { OutputStream outputStream = new FileOutputStream(file_record); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream); for (int j = 0; j < audioData.length; j++) { dataOutputStream.writeShort(audioData[j]); } dataOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } //Convert that .raw (testing.raw) file into .wav (testingNew.wav) file File des = new File(dir, "testingNew.wav"); try { rawToWave(file_record, des); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } } //convert .raw file to .wav File... private void rawToWave(final File rawFile, final File waveFile) throws IOException { byte[] rawData = new byte[(int) rawFile.length()]; DataInputStream input = null; try { input = new DataInputStream(new FileInputStream(rawFile)); input.read(rawData); } finally { if (input != null) { input.close(); } } DataOutputStream output = null; try { output = new DataOutputStream(new FileOutputStream(waveFile)); // WAVE header writeString(output, "RIFF"); // chunk id writeInt(output, 36 + rawData.length); // chunk size writeString(output, "WAVE"); // format writeString(output, "fmt "); // subchunk 1 id writeInt(output, 16); // subchunk 1 size writeShort(output, (short) 1); // audio format (1 = PCM) writeShort(output, (short) 1); // number of channels writeInt(output, SAMPLE_RATE); // sample rate writeInt(output, SAMPLE_RATE * 2); // byte rate writeShort(output, (short) 2); // block align writeShort(output, (short) 16); // bits per sample writeString(output, "data"); // subchunk 2 id writeInt(output, rawData.length); // subchunk 2 size // Audio data (conversion big endian -> little endian) short[] shorts = new short[rawData.length / 2]; ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts); ByteBuffer bytes = ByteBuffer.allocate(shorts.length * 2); for (short s : shorts) { bytes.putShort(s); } output.write(bytes.array()); } finally { if (output != null) { output.close(); } } } private void writeInt(final DataOutputStream output, final int value) throws IOException { output.write(value >> 0); output.write(value >> 8); output.write(value >> 16); output.write(value >> 24); } private void writeShort(final DataOutputStream output, final short value) throws IOException { output.write(value >> 0); output.write(value >> 8); } private void writeString(final DataOutputStream output, final String value) throws IOException { for (int i = 0; i < value.length(); i++) { output.write(value.charAt(i)); } } //playing merged file... private void playWavFile() { MediaPlayer recorded_audio_in_sounds = new MediaPlayer(); String outputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/testingNew.wav"; try { if (recorded_audio_in_sounds != null) { if (recorded_audio_in_sounds.isPlaying()) { recorded_audio_in_sounds.pause(); recorded_audio_in_sounds.stop(); recorded_audio_in_sounds.reset(); recorded_audio_in_sounds.setDataSource(outputFile); recorded_audio_in_sounds.prepare(); recorded_audio_in_sounds.setAudioStreamType(AudioManager.STREAM_MUSIC); recorded_audio_in_sounds.start(); recorded_audio_in_sounds.start(); } else { recorded_audio_in_sounds.reset(); recorded_audio_in_sounds.setDataSource(outputFile); recorded_audio_in_sounds.prepare(); recorded_audio_in_sounds.start(); recorded_audio_in_sounds.setVolume(2.0f, 2.0f); } } } catch (Exception e) { e.printStackTrace(); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.