Domanda

Sono porting un piccolo (<10 classi) C ++ progetto Java. I manipola progetto file audio e in C ++ fa questo utilizzando libsndfile . Il codice include cose come:

const int channels = audioFileInfo.channels;
...
sf_readf_double( audioFile, inputBuffer, MAX_ECHO );
...
sf_writef_double( outputAudioFile, &currentAudioBuffer[WINDOW_SIZE * channels], SEGMENTATION_LENGTH );

In Java, qual è il modo migliore per manipolare file audio su un livello basso? Sto parlando di cose come la normalizzazione, l'aggiunta di echi, ecc

Progress Report

Dopo un po 'di scavo ho trovato javax.sound.sampled , che sembra che potrebbe fare il lavoro.

Modifica 2 A ben vedere, non sarà il lavoro (o almeno non in alcun modo utilizzabile), dato che si basa sul pacchetto com.sun.sound.

Modifica 3 On ancora di più l'ispezione, e la sperimentazione, i pacchetti com.sun.sound e sun.misc sono rilasciati sotto licenza GNU GPLv2, e li ho scaricati nel mio progetto. Avendo javax.sound.sampled rinominato imp.javax.sound.sampled, le compilazioni di progetto, e posso creare oggetti AudioFileFormat senza eccezioni gettati, ancora. Non ho avuto la possibilità di giocare ancora molto ma vi terremo aggiornati.

Modifica 4 Ok, alcune cose sembrano funzionare con javax.sound.sampled, altri non. Per esempio, le chiamate come ad esempio:

AudioInputStream stream = AudioSystem.getAudioInputStream(waveFile));

non funzionano, però posso ottenere intorno a questo facendo:

WaveFileReader wfr = new WaveFileReader();
AudioInputStream stream = wfr.getAudioInputStream(waveFile);

In generale, chiama a cose come ritorno AudioSystem.getAudioFileTypes() liste vuote. Posso approfondire i pacchetti e vedere che sia qualcosa a che fare con i fornitori, ma sono in perdita su come porre rimedio a questa. Dopo aver ottenuto il mio oggetto stream lo fa segnalare la sua codifica ecc correttamente, il che è incoraggiante.

Il mio grosso problema in questo momento è la creazione di un oggetto clip. Questo deve essere creato con un oggetto linea, che normalmente provengono da AudioSystem. Qualcuno può pensare a un modo per aggirare questo?

È stato utile?

Soluzione

libsndfile può essere compilato per Android utilizzando il kit di sviluppo nativo. Una volta che hai la libreria compilata per Android, si dovrebbe essere in grado di utilizzare JNI per l'accesso da Java.

Altri suggerimenti

Perché non solo continuare questo codice in C ++ e richiamare nel vostro Java tramite JNI ?

Se è possibile la porta libsndfile utilizzando l'NDK, perché non utilizzare il NDK alla porta il codice C ++ direttamente e non preoccuparsi di porting di Java?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top