AS3客户端+ grails服务器 - 在客户端处理音频并将其发送回服务器

问题描述:

我们正在编写一个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

打开出局这是由enconding每一片WAV到MP3的过程中造成的。编码器将它们转换为完整的mp3文件,为每个作品的第一帧和最后一帧添加沉默。你可以在这里看到详细的解释:http://lame.sourceforge.net/tech-FAQ.txt

为了解决这个问题,我们不得不编辑ShineMP3Encoder源代码,所以它不会为每个处理的部分添加开始帧和结束帧(将其转换为“块处理器” )。这解决了这个问题,我们能够将修改后的mp3文件从客户端传输到服务器。