0

我们正在编写一个 Flash 应用程序,它可以下载 MP3 文件、将其转换为 Sound 对象、获取原始数据并进行一些处理(如添加声音、更改八度音阶)。处理完成后,我们希望将数据分块发送回服务器,以便服务器能够将数据粘合在一起并恢复新生成的文件。问题是:如果我们向服务器发送“wav”声音片段,我们可以在生成的文件中毫无问题地将它们粘合在一起。但是,如果我们将每个 wav 片段转换为 mp3 文件(这样我们可以将较小的文件发送到服务器)并在服务器上加入 mp3 文件,结果是在合并点出现一些问题的声音。

这是我们从服务器加载 mp3 文件的方式:

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

这就是我们如何将每一段 mp3 转换为 bytearray 和 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);

如果我们将每个 mini-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

4

1 回答 1

0

原来这是由将每段 wav 编码为 mp3 的过程引起的。编码器将它们转换为完整的 mp3 文件,为每段的第一帧和最后一帧添加静音。详细解释可以看这里: http: //lame.sourceforge.net/tech-FAQ.txt

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

于 2012-03-22T12:06:53.263 回答