Intereting Posts
Есть ли способ для push-уведомлений в libGDX (проекты Android и iOS)? Как закрыть активность и вернуться к предыдущей деятельности в android Диалог для выбора изображения из галереи или с камеры Обновить Android ListActivity при изменении данных списка? ClickView TextView в Android Приложение для Android не отображается в приложении? Создание хэш-карты / карты из XML-ресурсов Как заставить два устройства Android взаимодействовать через TCP Аутентификация SSL-клиента в Android 4.x API местоположения Google Play Service иногда возвращает неправильное местоположение Как создать панель кнопок верхнего или нижнего колонтитула для приложения для Android Изменить конфигурацию AndroidRuntimeException: requestFeature () необходимо вызывать перед добавлением исключительного содержимого для Honeycomb 3.1 – 3.2.1 Пользовательская панель быстрого поиска Listview в Android Insert} для завершения ошибки ClassBody даже при согласованных фигурных скобках

Использование AudioTrack в Android для воспроизведения WAV-файла

Я работаю с Android, пытаясь заставить приложение AudioTrack воспроизводить файл Windows .wav (Tada.wav). Честно говоря, это не должно быть так сложно, но я слышу много странных вещей. Файл сохраняется на мини-SD-карте моего телефона, и чтение содержимого не кажется проблемой, но когда я играю в файл (с параметрами я только PRETTY SURE прав), я получаю несколько секунд белого шума Прежде чем звук, кажется, разрешит себя во что-то, что просто может быть правильным.

Я успешно записал и воспроизвел свой собственный голос на телефоне – я создал файл .pcm в соответствии с указаниями в этом примере:

http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

(Без маскировки назад) …

Кто-нибудь получил некоторые предложения или понимание примера в Интернете для воспроизведения WAV-файла на Android?

Спасибо, Р.

Solutions Collecting From Web of "Использование AudioTrack в Android для воспроизведения WAV-файла"

Я наткнулся на ответ (честно говоря, попробовав & ^ @! Я не думал, что это сработает), если кто-то заинтересован … В моем исходном коде (который получен из примера в ссылке в исходном сообщении) Данные считываются из файла следующим образом:

InputStream is = new FileInputStream (file); BufferedInputStream bis = new BufferedInputStream (is, 8000); DataInputStream dis = new DataInputStream (bis); // Create a DataInputStream to read the audio data from the saved file int i = 0; // Read the file into the "music" array while (dis.available() > 0) { music[i] = dis.readShort(); // This assignment does not reverse the order i++; } dis.close(); // Close the input stream 

В этой версии музыка [] представляет собой массив SHORTS. Таким образом, метод readShort (), по-видимому, имеет смысл здесь, поскольку данные представляют собой 16-битный PCM … Однако на Android, похоже, проблема. Я изменил этот код на следующее:

  music=new byte[(int) file.length()];//size & length of the file InputStream is = new FileInputStream (file); BufferedInputStream bis = new BufferedInputStream (is, 8000); DataInputStream dis = new DataInputStream (bis); // Create a DataInputStream to read the audio data from the saved file int i = 0; // Read the file into the "music" array while (dis.available() > 0) { music[i] = dis.readByte(); // This assignment does not reverse the order i++; } dis.close(); // Close the input stream 

В этой версии музыка [] представляет собой массив BYTES. Я все еще говорю AudioTrack, что это 16-битные данные PCM, и у моего Android, похоже, не проблема с записью массива байтов в конфигурацию AudioTrack, настроенную таким образом … Во всяком случае, это, наконец, звучит правильно, поэтому, если кто-нибудь Другой хочет воспроизвести звуки Windows на своем Android, по какой-то причине это решение. Ах, Endianness ……

Р.

Пропускаете ли вы первые 44 байта файла, прежде чем вы оставите остальную часть данных файла в буфере? Первые 44 байта – это заголовок WAVE, и они будут звучать как случайный шум, если вы попытаетесь их воспроизвести.

Кроме того, уверены ли вы, что вы создаете AudioTrack с теми же свойствами, что и WAVE, который вы пытаетесь воспроизвести (частота дискретизации, скорость передачи, количество каналов и т. Д.)? Windows действительно хорошо справляется с предоставлением этой информации на странице «Свойства файла»: Alt text

Я нашел много длинных ответов на этот вопрос. Мое окончательное решение, которое, учитывая все вырезание и склеивание, едва ли мое, сводится к:

 public boolean play() { int i = 0; byte[] music = null; InputStream is = mContext.getResources().openRawResource(R.raw.noise); at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); try{ music = new byte[512]; at.play(); while((i = is.read(music)) != -1) at.write(music, 0, i); } catch (IOException e) { e.printStackTrace(); } at.stop(); at.release(); return STOPPED; } 

STOPPED – это просто «истина», отправленная назад в качестве сигнала для сброса кнопки паузы / воспроизведения. И в инициализаторе класса:

 public Mp3Track(Context context) { mContext = context; minBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); } 

Контекст – это просто «это» из вызывающей активности. Вы можете использовать FileInputStream на SD-карте и т. Д. Мои файлы находятся в res / raw

Как сказал Aaron C , вы должны пропустить начальные 44 байта или (как я предпочитаю) читать первые 44 байта, которые являются заголовком WAVE. Таким образом, вы знаете, сколько каналов, бит на выборку, длину и т. Д. Содержит WAVE.

Здесь вы можете найти хорошую реализацию анализатора WAVE заголовка / записи.

Пожалуйста, не увековечивайте ужасный код синтаксического анализа. Разбор WAV является тривиальным для реализации http://soundfile.sapp.org/doc/WaveFormat/, и вы будете благодарны, если сможете анализировать такие вещи, как частота дискретизации, глубина бит и количество каналов.

Кроме того, x86 и ARM (по крайней мере, по умолчанию) являются минимальными, поэтому файлы WAV с исходным текстом должны быть в порядке, без перетасовки.