Intereting Posts
Java.lang.IllegalStateException: нет активности Android Аннотации: Аннотированный класс Xyz_ не находит его оригинальным («не может найти символ класса Xyz») Как изменить часовой пояс с помощью adb Как исправить эту ошибку Ошибка Неподдерживаемая версия major.minor 52.0 в студии Android? Сохранить изображение из WebView Значок меню ящика навигации отображается неправильно IntentService: почему мой onHandleIntent никогда не называется? Android Facebook SDK 4.X, как получить адрес электронной почты и токен доступа Facebook, чтобы передать его веб-службе Android – удаление элемента из списка ListView при длительном нажатии Google в приложении покупки получить список продуктов Импорт хранилища ключей от eclipse до android studio Android: Как сделать TextView доступным для редактирования? Есть ли преимущества использования FusedLocationProviderApi над LocationManager? Как использовать универсальный загрузчик изображений Уведомление о Heads-Up – Android Lollipop

Потоковое аудио 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/