2012-03-08 131 views
0

我們正在編寫一個Flash應用程序,可以下載MP3文件,將其轉換爲Sound對象,獲取原始數據並進行一些處理(如添加聲音,改變八度)。處理完成後,我們希望以塊的形式將數據發送回服務器,這樣服務器就可以將數據粘貼在一起並恢復生成的新文件。問題是:如果我們向服務器發送「wav」聲音,我們可以將它們粘合在一起,而不會在生成的文件中出現任何問題。但是,如果我們將每個wav文件轉換爲mp3文件(因此我們可以發送一個較小的文件到服務器)並將其加入服務器的mp3文件,結果是在合併點處出現了一些問題。AS3客戶端+ grails服務器 - 在客戶端處理音頻並將其發送回服務器

這是我們如何從服務器加載MP3文件:

sourceSnd.load(new URLRequest("sample url to mp3")); 
sourceSnd.addEventListener(Event.COMPLETE, carregou); 

這就是我們如何轉換每一塊的MP3到字節組和WAV:

sourceSnd.extract(buffer, tamanho2);   
...process the extract sound and.... 
var bytesWav : ByteArray = new ByteArray(); 
buffer.position = 0; 
this.wavWriter.processSamples(bytesWav, buffer, 44100, 2); 

如果我們發送的每迷你wav文件返回到服務器(例如,使用套接字),我們可以將它們粘合在一起而不會出現任何問題。然而,如果我們將每個字節組WAV使用此代碼:

bytesWav.position = 0; 
var mp3Encoder : ShineMP3Encoder = new ShineMP3Encoder(bytesWav); 
var objeto : teste = this;         
mp3Encoder.addEventListener(Event.COMPLETE, function(event : Event) : void { 
    objeto.socket.send(mp3Encoder.mp3Data); 
}); 
mp3Encoder.start(); 

加入文件後,創建的MP3文件已經在「合併」的點數多的聲音問題。

我們該如何避免這樣的聲音問題?

客戶端技術:AS3 服務器端理工科:Grails的

+0

你使用的這個套接字類是什麼?你不使用標準的AS3套接字類嗎?我上次檢查時,AS3中的套接字類沒有「發送」功能。 – 2012-03-10 01:10:09

+0

Flash對於它加載的對象做出了荒謬的二進制修改而聞名。例如,Loader對象實際上會將額外的二進制數據附加到它加載的圖片和SWF文件。要閃光,不知何故,這在內部是有用的,但是當你嘗試導出你認爲是原始二進制數據的東西時,你會得到這個垃圾,它會破壞其他不需要額外垃圾的工具的可讀性。我懷疑這裏也是一樣。 – 2012-03-10 01:10:25

+0

感謝您的評論。閱讀完後,我們能夠解決問題:http://lame.sourceforge.net/tech-FAQ.txt。 Flash這次不是有罪的! – 2012-03-22 12:09:58

回答

0

打開出局這是由enconding每一片WAV到MP3的過程中造成的。編碼器將它們轉換爲完整的mp3文件,爲每個作品的第一幀和最後一幀添加沉默。你可以在這裏看到詳細的解釋:http://lame.sourceforge.net/tech-FAQ.txt

爲了解決這個問題,我們不得不編輯ShineMP3Encoder源代碼,所以它不會爲每個處理的部分添加開始幀和結束幀(將其轉換爲「塊處理器」 )。這解決了這個問題,我們能夠將修改後的mp3文件從客戶端傳輸到服務器。