2012-04-07 4 views
2

Ich mische zwei 16bit PCM Samples in einen kurzen Puffer.Java - 16bit Mono PCM Rohdaten in Stereo umwandeln

// This is our buffer for PCM audio data 
mp3Buffer = new short[minBufferSize]; 
wavBuffer = new short[minBufferSize]; 
mixedBuffer = new short[minBufferSize]; 

Ich fülle diese Puffer mit Samples aus den MP3- und WAV-Dateien. Ich habe herausgefunden, dass die WAV-Datei immer in Mono ist und das MP3 wird immer Stereo sein.

Ich habe gelesen, dass, wenn Sie

„Nur einen Puffer zuweisen doppelt so groß wie der Original-PCM-Daten, und für jede Probe in dem ursprünglichen Puffer zweimal in den neuen Puffer setzen“ kann
short[] stereoWavBuffer = new short[minBufferSize]; 
int k = 1; 
for (int j = 0; j < minBufferSize/2; j += 2) 
{ 
    stereoWavBuffer[j] = wavBuffer[j]; 
    stereoWavBuffer[k] = wavBuffer[k]; 
    k += 2; 

       } 
       // TO DO - Add the 2 buffers together 

       for (int i = 0; i < minBufferSize; i++){ 
        mixedBuffer[i] = (short)(mp3Buffer[i] + stereoWavBuffer[i]); 
       } 


       track.write(mixedBuffer, 0, minBufferSize); 
} 

Wie Ich beende das? Ich habe es versucht, aber das WAV-Audio ist jetzt mit normaler Geschwindigkeit, klingt aber nach Chipmunk.

+0

Sie sagen, dass ein Puffer von "minBufferSize" N Sekunden Audio ist, aber ein anderes ist 2N Sekunden Audio? – Gabe

+0

Ich habe die Frage geupdated, nach der Recherche scheint es besser, einfach das Mono in Stereo umzuwandeln, aber ich habe immer noch Probleme. minbufferSize ist N Sekunden Audio in Stereo. Also wenn ich den wavbuffer in 1: 1 mische, spielt es viel zu schnell. – nawlrus

+0

Was macht die Operation mit dem 'mixedBuffer'? Wenn Sie nur ein Sample zu einem anderen hinzufügen und das Ergebnis so runden, dass es in die 16 Bits passt, erhalten Sie nichts Gutes. Sie müssen das Ergebnis skalieren. Wie für die rohen WAV-Daten, ja, Sie müssen nur die Samples verschachteln (vorausgesetzt, Sie haben die Datenheader korrigiert). – Malcolm

Antwort

2

es mir, als ob Sie Ihre erste

j < minBufferSize - 1 
sein sollte

for-Schleife sieht

/2 bedeuten würde Sie nie alle der Wellenpuffer oder schreiben Sie Ihre gesamte Stereo-Puffer, lesen Sie - auch wenn Sie nur lesen halber Wellenpuffer, weil das alles Daten sind, da es mono ist, müssen Sie immer noch den gesamten Stereopuffer schreiben. Außerdem müssen Sie J um 1 und nicht um 2 erhöhen, damit Sie jedes Mono-Sample lesen können.

Das Geschwindigkeitsproblem scheint zu sein, weil Sie stereowavebuffer bei j und k gleich dem wavebuffer bei j setzen sollten. Es scheint, dass Sie tatsächlich nur die Hälfte der ursprünglichen Monodatei duplizieren. und dann wird es als Stereo wiedergegeben (dh: doppelte Byte-Rate).

Ich würde denken, die erste Schleife dies etwas mehr wie

int k = 0; 
for (int j = 0; j < minBufferSize/2; j++) //Assuming you only have half a buffer since mono??? 
{ 
    stereoWavBuffer[k] = wavBuffer[j]; 
    stereoWavBuffer[k+1] = wavBuffer[j]; 
    k += 2; 
} 

verarbeiteten schlecht ipad Typisierung zu beheben aussehen sollte!

+0

Heiliger Mist. ich danke dir sehr. Das hat funktioniert. Dies ist das erste Mal, dass ich mich mit Audio beschäftige, also war meine Logik komplett ausgeschaltet. Ich danke dir sehr!! – nawlrus