2013-07-03 26 views
28

Nagrywam dźwięk z getUserMedia({audio:true}); w przeglądarce przy użyciu adresu Recorder.js, a następnie eksportuję go jako plik WAV, ponieważ jest to jedyna opcja dostępna w bibliotece.Konwersja formatu WAV na dowolny skompresowany format audio po stronie klienta JavaScript

Plik trwający 1 minutę i 20 sekund ma rozmiar 14,1 MB. Muszę przesłać audio na serwer i muszę to zrobić szybko. Jak mogę przekonwertować dźwięk WAV w dowolnym innym skompresowanym formacie, aby zmniejszyć rozmiar pliku?

nie mam nic do konwersji:

  • MP3
  • Opus
  • WebM
  • Ogg
  • FLAC
  • jakiegokolwiek innego formatu znasz

Jeśli nie ma wa y jak teraz przekonwertować na dowolny z tych formatów, jak mogę skompresować plik WAV na kliencie?

PS: Zrobiłem wiele wyszukiwań, aby znaleźć coś, co konwertuje WAV w JS, ale nic nie znalazłem. libmp3lame.js nie działa w przeglądarce Chrome.

Dzięki!

+0

Mam podobny post na http://stackoverflow.com/questions/17507799/convert-wav-to-ogg-on-app-engine-or-in- javascript - Mam zasadniczo ten sam problem i mam nadzieję, że ktoś odpowie na twoje pytanie. – Adrian

+0

Widziałem twoje pytanie wczoraj. Dla mnie rozmiar pliku jest zbyt duży, więc przesłanie go na serwer i przekonwertowanie go nie jest realną opcją. W przypadku Twojego przypadku, jeśli chcesz przesłać, a następnie przekonwertować, korzystasz z maszyny wirtualnej. –

Odpowiedz

27

I Wcześniej wykonane rejestrator dźwięku, który rejestruje na mp3 bezpośrednio z przeglądarki łączącej RecorderJS i libmp3lame.js

można znaleźć tutaj: projekt gitHub https://github.com/nusofthq/Recordmp3js

i bardziej szczegółowe wyjaśnienie realizacji: http://nusofthq.com/blog/recording-mp3-using-only-html5-and-javascript-recordmp3-js/

+0

DZIĘKUJĘ, DZIĘKUJĘ, DZIĘKUJĘ. Żałuję, że nie mogłem tego zrobić 1000 razy. – Knights

+1

+ 1 Przeniosłem się również do użycia 'libmp3lame.js'. – CodingIntrigue

+1

@Remus Negrota, działa na Chrome, ale zawiesza się na Firefox. Z moich badań wynika, że ​​coś się nieskończenie powtarza w ** libmp3lame.min.js ** w Firefoksie. Czy używasz zmodyfikowanej wersji biblioteki libmp3lame.min.js? – Dewsworld

4

To, czego naprawdę chcesz, to mediaStream "Recording API", nad którym obecnie pracujesz. Dopóki to nie będzie dostępne, radzę użyć emscriptem na źródle C/C++ i rozważyć uruchomienie go w pracy sieciowej, aby uniknąć blokowania interfejsu i innych kart.

3

byłem stoi ten sam problem i wpadł na dość szybki i brudne rozwiązania:

  • ZIP wav plik z zip.js (działa z Chrome, Firefox, Safari 6 i Internet Explorer 10)

Dalsze Intel zobaczyć Documentation zip.js

przynajmniej ten jest zmniejszenie wielkości partii, plik jest o> 75% mniejszy więc 1: 4 kompresja

UPDATE: Może rzucić okiem na to: https://webrtc.github.io/samples/

To jest czat aplikacji dla Chrome i Firefox opracowanej przez Google, zakładam z rodzaju CC-licencji

+0

Dzięki! Wypróbuję to! :) –

2

Miałem podobny problem (również przy użyciu recorder.js) i udało mi się rozwiązać za pomocą wspaniałego projektu videoconverter.js, który zawiera port ffmpeg do JavaScript za pomocą emscripen. Mniejsze jest to, że plik ffmpeg.js ma około 25 MB.

Zmodyfikowałem istniejącą funkcję exportWAV w rejestratorzeWorker.JS powrotu zarówno wav (HTML5 <audio> playback) oraz BLOB zawierającą zakodowanego pliku MP2:

function encodeWAV(samples) { 

    var buffer = new ArrayBuffer(44 + samples.length * 2); 
    var view = new DataView(buffer); 

    /* ... various writing methods */ 

    return { wavdata: new Blob([buffer], { type: "audio/wav" }), mp2data: ffmpeg_convert(buffer) }; 
} 

function ffmpeg_convert(buffer) { 
    console.log("starting mp2 conversion"); 
    var args = "-i input -f mp2 output.mp2"; 
    var results = ffmpeg_run({ 
     arguments: args.split(" "), 
     files: [ 
      { 
       data: new Uint8Array(buffer), 
       "name": "input" 
      } 
     ] 
    }); 
    if (results) { 
     var file = results[0]; 
     console.log("File recieved", file.name, file.data); 
     return new Blob([file.data], { type: "audio/mpeg" }); 
    } 
    return null; 
} 

Ten sposób może być stosowany do kodowania wav dowolnego kodeka suppored przez FFmpega libavcodec

1

udało mi się osiągnąć kompresję za pomocą opus.js,

można znaleźć realizację tutaj: recordOpus, ale nie jest pewien haczyk, kopalnia jest połączona z server- po stronie i używam serwera node.js ....