|
2 bytes --> short * irgendwas --> 2 bytes
|
|
03 Sep 2009, 15:58
|
busy office
Punkte: 1655
seit: 30.06.2006
|
hi, ich kriege irgendwie seit Tagen keinen klaren Kopf bei dem ganzen Audiozeuch - folgendes: Ich habe eine WAV Datei, erzeuge einen audiostream und trenne die beiden Kanäle (Stereo file) in jeweils ein byte array. Soweit so gut funktioniert auch super. Nun will ich die einzelnen Bytes manipulieren, was ja auch kein Problem darstellt. Nur bekomme ich dabei ein Rauschen. Ein Sample besteht ja nun aus 4 Byte - 2 Byte für Links und 2 Byte für rechts. L L R R und ich will auf die 2 Byte des Linken kanals ein Gain (Lautstärke) multiplizieren und auf den rechten - was aber unterschiedliche Verstärkungsfaktoren sind. Mir wurde nun gesagt ich müsse die 2 Bytes aus dem Kanal in ein Short überführen, es manipulieren und wieder in die 2 Bytes packen. Nur funktioniert das nicht so richtig. Details auf der StackOverflow Seite
--------------------
Grüße sn3ek
|
|
|
|
|
03 Sep 2009, 16:17
|
No-Know-How
Punkte: 631
seit: 27.04.2007
|
Sowas mal angeguckt (von wegen signed/unsigned problematik + beispielcode)? Bin sonst in c++, nicht in java, unterwegs - deswegen kann ich nur vermuten das es unter java sicher genug bibliotheken für multimedia-zeug gibt.
|
|
|
|
|
03 Sep 2009, 18:30
|
der vierkonsonantige
Punkte: 3812
seit: 12.12.2003
|
mit c wäre das nicht passiert ne mal im ernst... CODE byte arr[] = getTheDataSonstewoHer(); int i = 0; while(i*4 < arr.length) { // annahme little endian, für big muss +0 und +1 sowie +2 und +3 getauscht werden // L int gegaehnt = ((((int)arr[i * 4 + 1]) << 8) | arr[i*4] ) * gaehn; arr[i*4] = (byte)(gegaehnt & 0xff); arr[i*4 +1] = (byte)((gegaehnt & 0xff00) >> 8); // R gegaehnt = ((((int)arr[i * 4 + 3]) << 8) + arr[i*4 + 2] ) * gaehn; arr[i*4 +2] = (byte)(gegaehnt & 0xff); arr[i*4 +3] = (byte)((gegaehnt & 0xff00) >> 8);
i++; }
denk bitte dran, dass du nur ganzzahlige verstärkungen machen kannst. ansonsten hilft dir nur der weg über byte -> int -> float -> rechnen -> int -> byte € paar klammern geeckt und verschoben €2: auf solaris gehört Dieser Beitrag wurde von stth: 03 Sep 2009, 18:37 bearbeitet
--------------------
|
|
|
|
|
03 Sep 2009, 18:34
|
pornös
Punkte: 653
seit: 28.10.2004
|
Zitat(stth @ 03 Sep 2009, 18:30) mit c wäre das nicht passiert ne mal im ernst... CODE byte arr = getTheDataSonstewoHer(); int i = 0; while(i*4 < arr.length()) { // annahme little endian, für big muss +0 und +1 sowie +2 und +3 getauscht werden // L int gegaehnt = (((int)arr[i * 4 + 1]) << 8 | arr[i*4] ) * gaehn; arr[i*4] = (byte)(gegaehnt & 0xff); arr[i*4 +1] = (byte)((gegaehnt & 0xff00) >> 8); // R gegaehnt = (((int)arr[i * 4 + 3]) << 8 + arr[i*4 + 2] ) * gaehn; arr[i*4 +2] = (byte)(gegaehnt & 0xff); arr[i*4 +3] = (byte)((gegaehnt & 0xff00) >> 8); }
denk bitte dran, dass du nur ganzzahlige verstärkungen machen kannst. ansonsten hilft dir nur der weg über byte -> int -> float -> rechnen -> int -> byte Ich kann mich irren, aber hast Du in dem Code vergessen, das i zu inkrementieren?
--------------------
|
|
|
|
|
03 Sep 2009, 18:57
|
busy office
Punkte: 1655
seit: 30.06.2006
|
Zitat(stth @ 03 Sep 2009, 18:30) mit c wäre das nicht passiert ne mal im ernst... CODE byte arr[] = getTheDataSonstewoHer(); int i = 0; while(i*4 < arr.length) { // annahme little endian, für big muss +0 und +1 sowie +2 und +3 getauscht werden // L int gegaehnt = ((((int)arr[i * 4 + 1]) << 8) | arr[i*4] ) * gaehn; arr[i*4] = (byte)(gegaehnt & 0xff); arr[i*4 +1] = (byte)((gegaehnt & 0xff00) >> 8); // R gegaehnt = ((((int)arr[i * 4 + 3]) << 8) + arr[i*4 + 2] ) * gaehn; arr[i*4 +2] = (byte)(gegaehnt & 0xff); arr[i*4 +3] = (byte)((gegaehnt & 0xff00) >> 8);
i++; }
denk bitte dran, dass du nur ganzzahlige verstärkungen machen kannst. ansonsten hilft dir nur der weg über byte -> int -> float -> rechnen -> int -> byte € paar klammern geeckt und verschoben €2: auf solaris gehört Mein Gain Control liegt zwischen 0 und irgendwas --> hängt vom Delay ab und das ist double demzufolge brauch ich die umwandlung byte--> int -> float --> rechnen --> int --> byte hast du vllt noch nen herz für mich und kannst mir das an nem codesnippet zeigen? bin irgendwie nach 2 wochen durchweg coden nicht mehr wirklich allein dazu fähig.. aber am montag muss das programm stehen... bin also für jede hilfe dankbar!!!
|
|
|
|
|
03 Sep 2009, 19:14
|
der vierkonsonantige
Punkte: 3812
seit: 12.12.2003
|
CODE byte arr[] = { 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, -50, 1, -50, 1, 0, 0, 0, 0}; int i = 0; double gaehn = 1.5; while (i * 4 < arr.length) { // annahme little endian, für big muss +0 und +1 sowie +2 und +3 getauscht werden // L int gegaehnt = (((((int) arr[i * 4 + 1]) << 8) & 0xFF00) | ((int) (arr[i * 4]) & 0xFF)); gegaehnt = (int)((double)gegaehnt * gaehn); arr[i * 4] = (byte)(gegaehnt | ((gegaehnt | 0x80) > 0 ? 0xffffff00 : 0)); arr[i * 4 + 1] = (byte)((gegaehnt >> 8) | ((gegaehnt | 0x8000) > 0 ? 0xffffff00 : 0));
// R gegaehnt = (((((int) arr[i * 4 + 3]) << 8) & 0xFF00) | ((int) (arr[i * 4 + 2]) & 0xFF)); gegaehnt = (int)((double)gegaehnt * gaehn); arr[i * 4 + 2] = (byte)(gegaehnt | ((gegaehnt | 0x80) > 0 ? 0xffffff00 : 0)); arr[i * 4 + 3] = (byte)((gegaehnt >> 8) | ((gegaehnt | 0x8000) > 0 ? 0xffffff00 : 0));
i++; }
auf den ersten blick geht das. es sind ein paar unnecessary casts drinne und die rückwandlung geht u.u. einfacher. teste aber erstmal, obs tut in allen lebenslagen
|
|
|
|
|
03 Sep 2009, 19:17
|
der vierkonsonantige
Punkte: 3812
seit: 12.12.2003
|
Zitat(sn3ek @ 03 Sep 2009, 19:14) So ich hab jetzt den code in mein Programm umgesetzt und es funktioniert nicht. Ich habe zwar den Sound der normal ist und zusätzlich das doofe rauschen oder zischen oder wie auch immer. Und das hatte ich auch schon vorher. Das ist auch wenn ich es mit 1 multipliziere wie hier zu sehen: CODE int z = 0; while(z*4 < Constants.getBufferlength()) { // annahme little endian, für big muss +0 und +1 sowie +2 und +3 getauscht werden // L int gegaehnt = ((((int)arrayLeft[z * 4 + 1]) << 8) | arrayLeft[z*4] ) * 1; arrayLeft[z*4 +0] = (byte)(gegaehnt & 0xff); arrayLeft[z*4 +1] = (byte)((gegaehnt & 0xff00) >> 8); // R gegaehnt = ((((int)arrayRight[z * 4 + 3]) << 8) + arrayRight[z*4 + 2] ) * 0; arrayRight[z*4 +2] = (byte)(gegaehnt & 0xff); arrayRight[z*4 +3] = (byte)((gegaehnt & 0xff00) >> 8);
z++; } du hast da zwo arrays. dann wird das sicherlich nicht passen mit den indizes. ich hatte mich an die LLRRLLRRLLRRLLRR - codierung in einem array aus dem ersten post gehalten
|
|
|
|
|
03 Sep 2009, 19:23
|
busy office
Punkte: 1655
seit: 30.06.2006
|
ja das hab ich jetzt angepasst also habs dorthin geschoben wo Left and Right wieder zurückgeschrieben werden ins Complete Array. ich teste das mal //edit nein es geht nicht. jetzt höre ich nichtmal mehr ton. nur noch solches geflattertes knistern und zwar sehr laut. Sowohl Big als auch Little Endian CODE float gaehn = 0.5f; int q =0; while (q * 4 < Constants.getBufferlength()) { // annahme little endian, für big muss +0 und +1 sowie +2 und +3 getauscht werden // L int gegaehnt = (((((int) arrayComplete[q * 4 + 1]) << 8) & 0xFF00) | ((int) (arrayComplete[q * 4]) & 0xFF)); gegaehnt = (int)((double)gegaehnt * gaehn); arrayComplete[q * 4] = (byte)(gegaehnt | ((gegaehnt | 0x80) > 0 ? 0xffffff00 : 0)); arrayComplete[q * 4 + 1] = (byte)((gegaehnt >> 8) | ((gegaehnt | 0x8000) > 0 ? 0xffffff00 : 0));
// R gegaehnt = (((((int) arrayComplete[q * 4 + 3]) << 8) & 0xFF00) | ((int) (arrayComplete[q * 4 + 2]) & 0xFF)); gegaehnt = (int)((double)gegaehnt * gaehn); arrayComplete[q * 4 + 2] = (byte)(gegaehnt | ((gegaehnt | 0x80) > 0 ? 0xffffff00 : 0)); arrayComplete[q * 4 + 3] = (byte)((gegaehnt >> 8) | ((gegaehnt | 0x8000) > 0 ? 0xffffff00 : 0));
q++; } Wofür das? gegaehnt = (int)((double)gegaehnt * gaehn);
|
|
|
2 Nutzer liest/lesen dieses Thema (2 Gäste)
0 Mitglieder:
|