Я пытаюсь реализовать функцию в приложении, которое я делаю, что позволяет пользователю прослушивать онлайн-поток. Что мне нужно сделать, так это загрузить файл вместе с его воспроизведением.Как загружать и передавать аудио в Android?
Я так много вычислил, что мне нужен локальный HTTP-сервер, который я использовал NanoHTTPD. Теперь сложной частью является то, как фактически загружать и передавать аудио одновременно.
Это код, который я придумал до сих пор:
public class LocalHttpServer extends NanoHTTPD {
public static final int SERVER_PORT = 5987;
private String mUrl;
private InputStream input;
private FileOutputStream output;
public LocalHttpServer(String url) {
super(SERVER_PORT);
mUrl = url;
}
private File createFile(String url) {
File path = new File(MyApplication.getContext().getFilesDir(), "audio/");
path.mkdirs();
return new File(path, Util.md5(url));
}
@Override
public Response serve(IHTTPSession session) {
input = null;
output = null;
HttpURLConnection connection = null;
try {
URL url = new URL(mUrl);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
return new Response(Response.Status.BAD_REQUEST, "audio/mpeg3", null, 0);
}
int fileLength = connection.getContentLength();
input = connection.getInputStream();
output = new FileOutputStream(createFile(mUrl));
new Thread(new Runnable() {
@Override
public void run() {
byte data[] = new byte[4096];
int count;
try {
while ((count = input.read(data)) != -1) {
output.write(data, 0, count);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (output != null)
output.close();
if (input != null)
//input.close(); don't close it
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
return new Response(Response.Status.OK, "audio/mpeg3", input, fileLength);
} catch (IOException e) {
e.printStackTrace();
}
return new Response(Response.Status.BAD_REQUEST, "audio/mpeg3", null, 0);
}
}
Проблема с ним, когда подается в MediaPlayer, происходит the unexpected end of stream
исключение.
Вы можете попробовать использовать https://github.com/google/ExoPlayer#, который также работает только с аудио. –
@HugoGresse Хорошо, похоже, что он работает, но как я могу использовать ExoPlayer для сохранения файла ? –
Зачем вы хотите сохранить файл? –