Проблема со звуком - PullRequest
       1

Проблема со звуком

1 голос
/ 15 июля 2011

В моем приложении для Android я могу записывать аудио и сохранять его на телефоне / SDK.Я проверил, что это слышно и ясно, когда я воспроизводить его на телефоне.Размер создаваемого аудиофайла составляет 5,9 КБ (формат .amr).Затем я загружаю файл на сервер, он сохраняет аудио на sql db.Загрузка успешно завершена.Когда воспроизводится загруженное аудио, оно искажается ...

В базе данных я храню аудио в столбце с изображением типа данных и имеет длину 16.

Мой вопрос ...почему шум искажается после загрузки.Как я могу убедиться, что аудио сохранено правильно без какого-либо шума.

Код для загрузки файла

InputStream = new DataInputStream(new FileInputStream( FileName));
            byte[] responseData = new byte[10000];   
            int length = 0;   
            StringBuffer rawResponse = new StringBuffer();   
            while (-1 != (length = InputStream.read(responseData)))
                rawResponse.append(new String(responseData, 0, length));   
            String finalstring = rawResponse.toString();
voicedataArray = finalstring.getBytes();

1 Ответ

2 голосов
/ 15 июля 2011

Вероятно, ваша проблема связана с использованием StringBuffer для буферизации ответа.Символ в Java является двухбайтовой сущностью, соответствующей точке символа Unicode.Документация для String # getBytes () гласит:

Возвращает новый байтовый массив, содержащий символы этой строки, закодированные с использованием системной кодировки по умолчанию.

Так что никаких гарантий нетчто байты, которые вы передаете, преобразуются в символы, а затем обратно в байты - это тот же поток, который вы передали в первую очередь.

Я думаю, вам нужно будет кодировать свое решение, используя динамически расширяемый байтовый буфер вместо StringBuffer.

Кроме того, два примечания об использовании StringBuffer:

1) Все обращения к StringBuffer синхронизированы, поэтому вы платите штраф за производительность.StringBuilder - это современная замена, которая не выполняет синхронизацию под капотом.

2) Каждый раз, когда вы добавляете в StringBuffer:

rawResponse.append(new String(responseData, 0, length));

, вы выделяете новую строку и бросаетеэто прочьЭто действительно оскорбительно для сборщика мусора.StringBuffer на самом деле имеет форму append(), которая будет напрямую принимать массив символов, поэтому нет необходимости использовать промежуточную строку.(Но вы, вероятно, не хотите использовать StringBuffer в первую очередь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...