2013-07-03 50 views
28

我在瀏覽器中使用Recorder.jsgetUserMedia({audio:true});中錄製音頻,然後將其導出爲WAV文件,因爲這是該庫提供的唯一選項。將WAV轉換爲客戶端JavaScript中的任何壓縮音頻格式

1分20秒文件是14.1 MB大。我需要將音頻上傳到服務器,並且需要快速完成。如何以任何其他壓縮格式轉換WAV音頻以降低文件大小?

我不介意轉換爲:

  • MP3
  • 作品
  • 的WebM
  • 奧格
  • FLAC
  • 任何其他格式,你知道的

如果沒有wa y截至目前可以轉換爲這些格式中的任何一種,我如何在客戶端上壓縮WAV文件? PS:我做了很多搜索來找到任何在JS中轉換WAV的東西,但什麼也沒找到。 libmp3lame.js在Chrome中無法使用。

謝謝!

+0

我有一個類似的帖子在http://stackoverflow.com/questions/17507799/convert-wav-to-ogg-on-app-engine-or-in- javascript - 我基本上有同樣的問題,我真的希望有人回答你的問題。 – Adrian

+0

我昨天看到你的問題。對我而言,文件大小太大,因此將其上傳到服務器並轉換它並不是一個可行的選項。對於你的情況,如果你想上傳然後轉換,使用虛擬機是最好的選擇。 –

回答

27

I」扶持產品VE做了錄音機直接從瀏覽器結合RecorderJS記錄到MP3和libmp3lame.js

你可以找到GitHub的項目在這裏: https://github.com/nusofthq/Recordmp3js

和實施的更詳細的解釋: http://nusofthq.com/blog/recording-mp3-using-only-html5-and-javascript-recordmp3-js/

+0

謝謝,謝謝,謝謝。我希望我能夠upvote這1000次 – Knights

+1

+1我也轉而使用'libmp3lame.js'。 – CodingIntrigue

+1

@Remus Negrota,這適用於Chrome,但掛在Firefox上。我的研究發現,在Firefox中的** libmp3lame.min.js **中發生了無限循環。您是否使用libmp3lame.min.js的修改版本? – Dewsworld

4

你真正想要的是目前正在開發的mediaStream「Recording API」。在可用之前,我建議在C/C++源代碼上使用emscriptem,並考慮在webworker中運行它以避免阻塞UI和其他選項卡。

3

我面臨同樣的問題, 想出了相當快速和骯髒的解決方案:

  • 壓縮的WAV文件與zip.js(在Chrome,火狐,Safari 6和Internet工程資源管理器10)

此外英特爾看到Documentation zip.js

至少這是減小尺寸很多,文件是小約> 75%,因此1:4的壓縮

更新:也許看看這個:https://webrtc.github.io/samples/

它針對Chrome和Firefox由谷歌開發的聊天應用程序,我想用一種CC-許可證

+0

謝謝!我會嘗試一下! :) –

2

我有一個類似的問題(也使用recorder.js),並設法使用emscripen使用極好的videoconverter.js項目,其中包括一個ffmpeg到JavaScript的端口到Javascript。這方面的缺點是ffmpeg.js文件大約是25Mb。

我修改了recorderWorker中現有的exportWAV函數。JS返回兩者WAV(用於HTML5 <audio>播放)和含有一個編碼MP2文件的Blob:

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; 
} 

此方法可用於編碼WAV到任何編解碼器通過FFmpeg的libavcodec

1

我能夠使用opus.js實現壓縮,

,你可以在這裏找到我的實現:recordOpus,但有一個陷阱,地雷被加上服務器 - 我使用node.js服務器....

相關問題