Tôi đã tạo một ứng dụng radio hoạt động hoàn toàn tốt. Tôi có thể phát luồng radio và tìm nạp siêu dữ liệu. Dịch vụ phát trực tuyến là từ shoutcast.Làm cách nào để tách siêu dữ liệu và bản nhạc khỏi luồng truyền phát mà không yêu cầu siêu dữ liệu riêng và phát trực tuyến
Vấn đề duy nhất là, tôi thêm url làm nguồn dữ liệu vào trình phát đa phương tiện và sau đó tìm nạp tiêu đề và nghệ sĩ cứ 5 giây một lần.
Có cách nào, tôi chỉ có thể thực hiện một yêu cầu http và sau đó chia âm thanh và siêu dữ liệu rồi gửi cho trình phát đa phương tiện không?
Mã để tìm nạp Siêu dữ liệu.
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;
}
Và đi qua các url với nguồn dữ liệu của media player
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();
}
Có, bạn chỉ cần bỏ qua siêu dữ liệu từ luồng. Xem câu trả lời này để biết thêm chi tiết: http://stackoverflow.com/questions/4911062/pulling-track-info-from-an-audio-stream-using-php/4914538#4914538 Nếu bạn muốn có câu trả lời cụ thể cho Java trên Android , bạn nên hiển thị mã của mình về cách bạn đang nhận dữ liệu luồng hiện tại. – Brad
@Brad Xem câu trả lời cập nhật của tôi. Cảm ơn. – Searock