Intereting Posts
PopupWindow вне экрана, когда размер неуточнен Изображения с изображениями на поверхности камеры выглядят растянутыми Поиск «имени класса Android» в «AndroidManifest.xml», созданный Unity3D Преобразование изображения в видео с эффектом перехода Не удалось отладить библиотечные проекты с помощью ADT v14 – Источник не найден Как я могу разобрать xml из url в android? Что означает «@aar» в задаче «компиляция градиента» Tinting ImageView не работает на Android 5.0. Идеи, как заставить его работать снова? Получение текущего часового пояса в приложении android Требуется ли WebView WebViewClient для работы? Запись / Geotag JPEG (данные EXIF) в Android Чтение простого текстового файла Как центрировать заголовок на панели инструментов (даже при отображении кнопки панели инструментов) Используя данные поставщиков контекста или запрашивая разрешение на просмотр Google Фото? Android WebView UTF-8 не отображается

Потоковое аудио MP3 через сокетную связь с использованием OpenSL ES на Android

Я пытаюсь передать MP3 с телефона Android на другой телефон Android, используя WiFi через точку доступа. Проблема заключается в том, что OpenSL ES, по-видимому, поддерживает только аудио-буферы PCM в качестве источника (если не используется URI). Вместо того, чтобы декодировать потенциально огромный файл на стороне «Мастер» перед отправкой, я бы предпочел, чтобы «Клиент» декодировал MP3 в PCM. Имейте в виду, что это должно происходить как потоки файлов, а не просто отправлять весь файл, а затем декодировать. Есть ли способ сделать это с помощью OpenSL ES? Аудио трек? Похоже, это будет довольно распространенный запрос.

Solutions Collecting From Web of "Потоковое аудио MP3 через сокетную связь с использованием OpenSL ES на Android"

Вы правы, что opensl, похоже, не принимает простую буферную очередь с mp3-источником. При этом вы должны использовать SLDataLocator_URI. Теперь я понимаю, что у вас нет полного файла, доступного при запуске (с момента потоковой передачи), но есть способ обойти это. Если вы создаете пустой файл и используете его в качестве источника для проигрывателя URI opensl, все должно работать. Когда вы получаете данные (биты mp3-файла), просто добавьте эти данные в пустой файл, который вы создали. Вы можете запустить OpenSL из этого файла, прежде чем вы закончите добавлять к нему данные.

Создайте пустой файл с помощью:

RandomAccessFile raf = new RandomAccessFile(new File(mFileUri), "rw"); raf.setLength(audioFileSize); 

Создайте свой источник звука как:

 SLDataLocator_URI loc_uri = {SL_DATALOCATOR_URI, (SLchar *) fileLoc}; SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED}; SLDataSource audioSrc = {&loc_uri, &format_mime}; 

Загрузите буферы с помощью:

 for (int i = 0; i < BUFFER_COUNT; i++) { // get byte[] data from stream raf.seek(i*Constants.BUFFER_SIZE); raf.write(data); } 

Начните воспроизведение звука в любое время с помощью OpenSL, а затем продолжите загрузку буферов. Если вы останетесь впереди кривой в своем потоковом процессе, вы должны быть в порядке.

Вам нужно использовать opensl. MediaCodec (доступен в Android 4.2) может декодировать mp3 в фрагменты PCM, которые можно передать в AudioTrack.

Вы пробовали этот пример аудиопрограммы Виктора Лаззарини с помощью OpenSL ES.

Он обеспечивает хорошую поточную реализацию на основе http://mobilepearls.com/labs/native-android-api/ndk/docs/opensles/