Клиент AS3 + сервер Grails — обработка звука на клиенте и отправка его обратно на сервер

Мы пишем флэш-приложение, которое может загружать файл 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);

Если мы отправим каждый мини-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


person Rafael Augusto Mendes Moreira    schedule 08.03.2012    source источник
comment
Что это за класс сокета, который вы используете? Вы не используете стандартный класс Socket AS3? В прошлый раз, когда я проверял, класс сокета в AS3 не имеет функции отправки.   -  person    schedule 10.03.2012
comment
Flash славится нелепыми бинарными модификациями загружаемых объектов. Например, объект Loader фактически добавит дополнительные двоичные данные к изображениям и SWF-файлам, которые он загружает. Для прошивки это как-то внутренне полезно, но когда вы пытаетесь экспортировать то, что вы считаете необработанными двоичными данными, вы получаете этот мусор, который разрушает читаемость другими инструментами, которые не ожидают этого дополнительного мусора. Подозреваю, что здесь происходит то же самое.   -  person    schedule 10.03.2012
comment
Спасибо за комментарии. Мы смогли решить проблему, прочитав это: lame.sourceforge.net/tech-FAQ.txt. . На этот раз Флэш не был виноват!   -  person Rafael Augusto Mendes Moreira    schedule 22.03.2012


Ответы (1)


Оказывается, это было вызвано процессом преобразования каждой части wav в mp3. Кодировщик преобразовывал их в целые мп3-файлы, добавляя тишину к первому и последнему кадру каждого фрагмента. Вы можете увидеть подробное объяснение здесь: http://lame.sourceforge.net/tech-FAQ.txt

Чтобы решить эту проблему, нам пришлось отредактировать исходный код ShineMP3Encoder, чтобы он не добавлял начальный и конечный кадры для каждого обрабатываемого фрагмента (превращая его в «обработчик фрагментов»). Это решило проблему, и мы смогли передать измененный mp3-файл с клиента на сервер.

person Rafael Augusto Mendes Moreira    schedule 22.03.2012