Intereting Posts
Стандарты кодирования для Android Как определить, вернулась ли из детской активности? Android различной ширины макетов в ViewPager Как исправить нижний относительный макет, когда приходит мягкая клавиатура? Мгновенный запуск в Android Studio 2.0 (как отключить) Поддерживает ли Android KitKat устройства, поддерживающие Bluetooth LE, в качестве периферийного устройства? BitmapFactory.decodeResource возвращает измененный Bitmap в Android 2.2 и неизменный Bitmap в Android 1.6 Кнопка Override Power, как кнопка «Домой» Recyclerview внутри вложенного просмотра прокрутки, загружая все данные вместо вызова по одному изображению при прокрутке Изображение андроида установлено как значок контакта / обои Ошибка EPIPE (Broken Pipe) при использовании FileTransfer-plugin с cordova 2.0 Предварительный просмотр горизонтальной обработки в андроид-студии AppWidget не отображается в списке виджетов запуска только на устройствах с леденцом Есть ли способ автоматически генерировать геттеры и сеттеры в Eclipse? Почему «Кнопки в панелях кнопок должны быть без полей» в Android API Level 15?

Как отделить метаданные и дорожку от потока крики, не делая отдельного запроса на метаданные и потоковое

Я сделал приложение для радио, которое прекрасно работает. Я могу воспроизводить радиопоток и получать метаданные. Потоковая служба – от крика.

Единственная проблема заключается в том, что я добавляю URL-адрес в качестве источника данных для медиаплеера, а затем получаю название и исполнитель каждые 5 секунд.

Есть ли способ, я могу просто сделать один HTTP-запрос, а затем разделить аудио и метаданные, а затем отправить его на медиа-плеер?

Код для получения метаданных.

private void retreiveMetadata() throws IOException { int metaDataOffset = 0; OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .addHeader("Icy-MetaData", "1") .addHeader("Connection", "close") .addHeader("Accept", "") .url(streamUrl) .build(); request.headers(""); Response response = client.newCall(request).execute(); InputStream stream = response.body().byteStream(); //Map<String, List<String>> headers = response..getHeaderFields(); if (!response.headers("icy-metaint").equals("")) { // Headers are sent via HTTP String icyMetaInt = response.headers("icy-metaint").toString(); icyMetaInt = icyMetaInt.replace("[", ""); icyMetaInt = icyMetaInt.replace("]", ""); metaDataOffset = Integer.parseInt(icyMetaInt); } else { // Headers are sent within a stream StringBuilder strHeaders = new StringBuilder(); char c; while ((c = (char)stream.read()) != -1) { strHeaders.append(c); if (strHeaders.length() > 5 && (strHeaders.substring((strHeaders.length() - 4), strHeaders.length()).equals("\r\n\r\n"))) { // end of headers break; } } // Match headers to get metadata offset within a stream Pattern p = Pattern.compile("\\r\\n(icy-metaint):\\s*(.*)\\r\\n"); Matcher m = p.matcher(strHeaders.toString()); if (m.find()) { metaDataOffset = Integer.parseInt(m.group(2)); } } // In case no data was sent if (metaDataOffset == 0) { isError = true; return; } // Read metadata int b; int count = 0; int metaDataLength = 4080; // 4080 is the max length boolean inData = false; StringBuilder metaData = new StringBuilder(); // Stream position should be either at the beginning or right after headers while ((b = stream.read()) != -1) { count++; // Length of the metadata if (count == metaDataOffset + 1) { metaDataLength = b * 16; } if (count > metaDataOffset + 1 && count < (metaDataOffset + metaDataLength)) { inData = true; } else { inData = false; } if (inData) { if (b != 0) { metaData.append((char)b); } } if (count > (metaDataOffset + metaDataLength)) { break; } } // Set the data metadata = IcyStreamMeta.parseMetadata(metaData.toString()); // Close stream.close(); } public static Map<String, String> parseMetadata(String metaString) { Map<String, String> metadata = new HashMap(); String[] metaParts = metaString.split(";"); Pattern p = Pattern.compile("^([a-zA-Z]+)=\\'([^\\']*)\\'$"); Matcher m; for (int i = 0; i < metaParts.length; i++) { m = p.matcher(metaParts[i]); if (m.find()) { metadata.put((String)m.group(1), (String)m.group(2)); } } return metadata; } 

И передача URL-адреса в источник данных медиаплеера

 String url = "http://68.68.109.106:8356/"; mp = new MediaPlayer(); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); try { mp.setDataSource(url); mp.prepare(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show(); } catch (SecurityException e) { // TODO Auto-generated catch block Log.e(TAG, "SecurityException"); Toast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show(); } catch (IllegalStateException e) { // TODO Auto-generated catch block Log.e(TAG, "IllegalStateException"); Toast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { // TODO Auto-generated catch block Log.e(TAG, "IOException"); Toast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show(); } 

Solutions Collecting From Web of "Как отделить метаданные и дорожку от потока крики, не делая отдельного запроса на метаданные и потоковое"

Задача, которую вы пытаетесь достичь, – это не то, что легко сделать. (То, что это не невозможно.) Метаданные потока только «загружаются» в начале потока, поэтому изменение его впоследствии не повлияет на чтение метаинформаций, «кэшированных» из потока. Чтобы прочитать новые свойства, вам необходимо перезапустить поток, это приведет к новым заголовкам и т. Д. (Но это может привести к перерыву в потоке, поэтому это не рекомендуется).

В звуковой технике принято использовать водяные знаки . Это процесс, в котором вы обогащаете свой звук каким-то данным в пути разрушения (качества). ( Использование на youtube. ) Altogh это трудно сделать, есть некоторые способы скрыть вашу информацию в потоке. Я рекомендую прочитать это, чтобы достичь цели, которую вы хотите достичь.

Поскольку ваше оборудование является мобильным телефоном, и не все устройства Android достаточно сильны, вам следует рассмотреть некоторые новые HTTP-запросы. Обработка звука – это не дешевая вещь, говорящая о процессоре, памяти и т. Д. Есть и другие варианты, если вы это сделаете. Пятисекундный опрос – это не лучший способ получить информацию, потому что вы можете отображать ложную информацию для пользователя, а ложная информация хуже, чем ничего. Я рекомендую push-сервер на основе mqtt. Вот довольно хороший пример использования. Решение, основанное на этом методе опроса, использует меньшее количество трафика и является более точным.