Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Audio] Equalizer+Playlista
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Lock
Witam.
Mam niewiele doświadczenia jeśli chodzi o technologie web'owe dlatego zgłaszam się do Państwa o pomoc. Otóż mam do zrobienia odtwarzacz audio z equalizerem i playlistą. Znalazłem w internecie skrypt do equalizera ale nie potrafię dorobić do tego playlisty. Byłbym niezmiernie wdzięczny za pomoc.
Oto skrypt equalizera:

  1. <div><canvas id="equaliz" width="512" height="300"></canvas></div>
  2. <audio controls preload="auto"
  3. id="audio-element"
  4. src="song1.mp3"
  5. style="width: 512px;">
  6. </audio>
  7. var canvas = document.getElementById('equaliz'),
  8. ctx = canvas.getContext('2d'),
  9. channels,
  10. rate,
  11. frameBufferLength,
  12. equaliz;
  13.  
  14. function loadedMetadata() {
  15. channels = audio.mozChannels;
  16. rate = audio.mozSampleRate;
  17. frameBufferLength = audio.mozFrameBufferLength;
  18.  
  19. equaliz = new FFT(frameBufferLength / channels, rate);
  20. }
  21.  
  22. function audioAvailable(event) {
  23. var fb = event.frameBuffer,
  24. t = event.time, /* unused, but it's there */
  25. signal = new Float32Array(fb.length / channels),
  26. magnitude;
  27.  
  28. for (var i = 0, fbl = frameBufferLength / 2; i < fbl; i++ ) {
  29. // Assuming interlaced stereo channels,
  30. // need to split and merge into a stero-mix mono signal
  31. signal[i] = (fb[2*i] + fb[2*i+1]) / 2;
  32. }
  33.  
  34. equaliz.forward(signal);
  35.  
  36. // Clear the canvas before drawing spectrum
  37. ctx.clearRect(0,0, canvas.width, canvas.height);
  38.  
  39. for (var i = 0; i < equaliz.spectrum.length; i++ ) {
  40. // multiply spectrum by a zoom value
  41. magnitude = equaliz.spectrum[i] * 4000;
  42.  
  43. // Draw rectangle bars for each frequency bin
  44. ctx.fillRect(i * 4, canvas.height, 3, -magnitude);
  45. }
  46. }
  47.  
  48. var audio = document.getElementById('audio-element');
  49. audio.addEventListener('MozAudioAvailable', audioAvailable, false);
  50. audio.addEventListener('loadedmetadata', loadedMetadata, false);
  51.  
  52. // FFT from dsp.js, see below
  53. var FFT = function(bufferSize, sampleRate) {
  54. this.bufferSize = bufferSize;
  55. this.sampleRate = sampleRate;
  56. this.spectrum = new Float32Array(bufferSize/2);
  57. this.real = new Float32Array(bufferSize);
  58. this.imag = new Float32Array(bufferSize);
  59. this.reverseTable = new Uint32Array(bufferSize);
  60. this.sinTable = new Float32Array(bufferSize);
  61. this.cosTable = new Float32Array(bufferSize);
  62.  
  63. var limit = 1,
  64. bit = bufferSize >> 1;
  65.  
  66. while ( limit < bufferSize ) {
  67. for ( var i = 0; i < limit; i++ ) {
  68. this.reverseTable[i + limit] = this.reverseTable[i] + bit;
  69. }
  70.  
  71. limit = limit << 1;
  72. bit = bit >> 1;
  73. }
  74.  
  75. for ( var i = 0; i < bufferSize; i++ ) {
  76. this.sinTable[i] = Math.sin(-Math.PI/i);
  77. this.cosTable[i] = Math.cos(-Math.PI/i);
  78. }
  79. };
  80.  
  81. FFT.prototype.forward = function(buffer) {
  82. var bufferSize = this.bufferSize,
  83. cosTable = this.cosTable,
  84. sinTable = this.sinTable,
  85. reverseTable = this.reverseTable,
  86. real = this.real,
  87. imag = this.imag,
  88. spectrum = this.spectrum;
  89.  
  90. if ( bufferSize !== buffer.length ) {
  91. throw "Supplied buffer is not the same size as defined FFT. FFT Size: " + bufferSize + " Buffer Size: " + buffer.length;
  92. }
  93.  
  94. for ( var i = 0; i < bufferSize; i++ ) {
  95. real[i] = buffer[reverseTable[i]];
  96. imag[i] = 0;
  97. }
  98.  
  99. var halfSize = 1,
  100. phaseShiftStepReal,
  101. phaseShiftStepImag,
  102. currentPhaseShiftReal,
  103. currentPhaseShiftImag,
  104. off,
  105. tr,
  106. ti,
  107. tmpReal,
  108. i;
  109.  
  110. while ( halfSize < bufferSize ) {
  111. phaseShiftStepReal = cosTable[halfSize];
  112. phaseShiftStepImag = sinTable[halfSize];
  113. currentPhaseShiftReal = 1.0;
  114. currentPhaseShiftImag = 0.0;
  115.  
  116. for ( var fftStep = 0; fftStep < halfSize; fftStep++ ) {
  117. i = fftStep;
  118.  
  119. while ( i < bufferSize ) {
  120. off = i + halfSize;
  121. tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);
  122. ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);
  123.  
  124. real[off] = real[i] - tr;
  125. imag[off] = imag[i] - ti;
  126. real[i] += tr;
  127. imag[i] += ti;
  128.  
  129. i += halfSize << 1;
  130. }
  131.  
  132. tmpReal = currentPhaseShiftReal;
  133. currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);
  134. currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);
  135. }
  136.  
  137. halfSize = halfSize << 1;
  138. }
  139.  
  140. i = bufferSize/2;
  141. while(i--) {
  142. spectrum[i] = 2 * Math.sqrt(real[i] * real[i] + imag[i] * imag[i]) / bufferSize;
  143. }
  144. };
  145. </script>


Dla kogoś doświadczonego zrobienie takiej playlisty zajmie zapewne kilka minut.
Pozdrawiam.

Znalazłem bardzo ciekawą playlistę tylko nie potrafię połączyć tych dwóch skryptów :/
Oto ta playlista: view-source:http://jonhall.info/examples/html5_audio_playlist_example.html
błagam o pomoc sad.gif
lukasz1985
Śmieszne, jest to, że zwyczajne wykonywanie kodu JavaScript jest w świecie nazywane "technologią webową".

Szczerze mówiąc to odradzam Ci robienie takich rzeczy w oparciu o API przeglądarek - to będzie działać tylko w nowszych wersjach Chrome i, z tego co czytałem w Safari. Firefox nie ma Web Audio API (nawet nie wiem czy jest obecne) domyślnie włączonego, a o IE przecież nie ma co mówić.

Lepiej będzie jakbyś znalazł jakiś equalizer wykonany we flashu, z playlistą, inaczej dostępność takiego rozwiązania będzie na poziomie kilku procent.

Twojego przykładu nie mogłem uruchomić z włączonym equalizerem ani w Firefoxie (ponieważ ten kod opiera się o starsze API, które jest dezaprobowane "z ang. deprecated"), ani w Chrome, gdzie w ogóle było nieobecne.

Ewentualnie pomyślałbym o tej bibliotece: http://www.schillmania.com/projects/soundmanager2/

Tyle mogę pomóc ze swojej strony.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.