Android에서 오디오를 다운로드하고 스트리밍하는 방법은 무엇입니까?

2 부끄러워

사용자가 온라인 스트림을들을 수있는 기능을 내가 만들고있는 앱에 구현하려고합니다. 내가해야 할 일은 재생과 함께 파일을 다운로드하는 것입니다.

나는 NanoHTTPD를 사용하는 로컬 HTTP 서버가 필요하다는 것을 너무 많이 알아 냈습니다 . 이제 까다로운 부분은 실제로 오디오를 동시에 다운로드하고 스트리밍하는 방법입니다.

이것은 내가 지금까지 생각 해낸 코드입니다.

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예외가 발생 한다는 것입니다 .

2 부끄러워

아무도 내 질문에 대한 답변을 게시하지 않았기 때문에 비슷한 작업을 수행하는 데 사용한 또 다른 솔루션을 여기에 가져 왔습니다.

AsyncTask를 사용하여 파일을 다운로드하고 다운로드가 전체의 10 %에 도달하면 인터페이스 콜백을 사용하여 MediaPlayer를 시작할 수 있다고 생각했습니다. 그리고 추가 20 %가 다운로드 될 때마다 MediaPlayer를 업데이트합니다.

다음은 AsyncTask의 소스입니다 : https://gist.github.com/2hamed/63a31bd55fc6514d12b5

public class DownloadAndPlayAsyncTask extends AsyncTask<String, Integer, Integer> {
    private static final String TAG = "DownloadAndPlayAsync";
    DownloadCallback downloadCallback;
    File tempFile, fullFile;

    private void createFiles(String url) {
        tempFile = Util.getTempFilePath(url);
        fullFile = Util.getFilePath(url);
    }

    public void setOnDownloadCallback(DownloadCallback callback) {
        downloadCallback = callback;
    }

    @Override
    protected Integer doInBackground(String... strings) {

        if (Util.isFileDownloaded(strings[0])) {
            createFiles(strings[0]);
            return 1;
        }
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(strings[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            // expect HTTP 200 OK, so we don't mistakenly save error report
            // instead of the file
            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                Log.d(TAG, "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage());
                return -1;
            }

            // this will be useful to display download percentage
            // might be -1: server did not report the length
            int fileLength = connection.getContentLength();
            createFiles(strings[0]);
            // download the file
            input = connection.getInputStream();
            output = new FileOutputStream(tempFile);

            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                // allow canceling with back button
                if (isCancelled()) {
                    input.close();
                    return null;
                }
                total += count;
                // publishing the progress....
                if (fileLength > 0) // only if total length is known
                    publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return 0;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        if (result == 0) {
            try {
                Util.copy(tempFile, fullFile);
                tempFile.delete();
                if (downloadCallback != null) {
                    downloadCallback.onFinished(fullFile.getAbsolutePath());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else if (result == 1) {
            if (downloadCallback != null) {
                downloadCallback.onFinished(fullFile.getAbsolutePath());
            }
        } else {
            if (downloadCallback != null) {
                downloadCallback.onFailed();
            }
        }
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        if (downloadCallback != null) {
            downloadCallback.onProgressUpdate(values[0], tempFile.getAbsolutePath());
        }
    }

    @Override
    protected void onCancelled(Integer result) {
        super.onCancelled(result);
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
    }

    public interface DownloadCallback {
        void onProgressUpdate(int progress, String filePath);

        void onFinished(String fullFile);

        void onFailed();
    }
}

DownloadCallback코드 끝에 가있는 것을 알 수 있습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

URL에서 오디오를 스트리밍 / 다운로드 및 재생하는 방법은 무엇입니까?

분류에서Dev

Windows 10에서 Python (다운로드하지 않고)의 Youtube URL에서 오디오를 스트리밍하는 방법은 무엇입니까?

분류에서Dev

iOS 13에서 원격 오디오를 스트리밍하는 방법은 무엇입니까? (SwiftUI)

분류에서Dev

YouTube, Dailymotion, Vimeo 등과 같은 사이트에서 플래시 (스트리밍) 비디오를 다운로드하는 방법은 무엇입니까?

분류에서Dev

YouTube, Dailymotion, Vimeo 등과 같은 사이트에서 플래시 (스트리밍) 비디오를 다운로드하는 방법은 무엇입니까?

분류에서Dev

YouTube, Dailymotion, Vimeo 등과 같은 사이트에서 플래시 (스트리밍) 비디오를 다운로드하는 방법은 무엇입니까?

분류에서Dev

WebRTC 오디오를 Icecast 서버로 스트리밍하는 방법은 무엇입니까?

분류에서Dev

URL에서 비디오를 스트리밍하는 동안 오디오 또는 비디오 만 캡처하는 방법은 무엇입니까?

분류에서Dev

텍스트와 비디오를 동시에 스트리밍하는 방법은 무엇입니까?

분류에서Dev

브라우저에서 인터넷 라디오를 스트리밍하는 방법은 무엇입니까?

분류에서Dev

브라우저에서 인터넷 라디오를 스트리밍하는 방법은 무엇입니까?

분류에서Dev

iPhone에서 비디오를 스트리밍하는 방법은 무엇입니까?

분류에서Dev

FFMPEG에서 입력 오디오를 트리밍하는 방법은 무엇입니까?

분류에서Dev

Android 모바일에서 웹 사이트로 오디오를 스트리밍하는 방법은 무엇입니까?

분류에서Dev

웹 사이트에서 모든 비디오를 다운로드하는 방법은 무엇입니까?

분류에서Dev

웹 사이트에서 비디오 다운로드를 비활성화하는 방법은 무엇입니까?

분류에서Dev

Android에서 RTSP 링크를 사용하여 비디오를 라이브 스트리밍하는 방법은 무엇입니까?

분류에서Dev

nodejs를 사용하여 cloudinary에서 비디오를 다운로드하는 방법은 무엇입니까?

분류에서Dev

입력 오디오를 트리밍 한 다음 단일 ffmpeg 명령에서 비디오의 실제 오디오로 바꾸는 방법은 무엇입니까?

분류에서Dev

iPhone 사진 라이브러리에 비디오를 다운로드하는 방법은 무엇입니까?

분류에서Dev

자막이있는 YouTube에서 비디오를 다운로드하는 방법은 무엇입니까?

분류에서Dev

URLSession을 사용하여 비디오를 다운로드하고 appcelerator titanium에서 저장하고 재생하는 방법은 무엇입니까?

분류에서Dev

Linux에서 rtmp 비디오 스트림을 다운로드하는 방법은 무엇입니까?

분류에서Dev

html 폴더 외부에서 오류없이 비디오를 스트리밍하는 방법은 무엇입니까?

분류에서Dev

Android에서 다중 파일 오디오 레코드를 병합하는 방법은 무엇입니까?

분류에서Dev

URL에서 AAC 오디오를 녹음하는 방법은 무엇입니까?

분류에서Dev

YouTube에서 오디오가 포함 된 720p 이상의 비디오를 다운로드하는 방법은 무엇입니까?

분류에서Dev

DJI Professional 3 카메라에서 라이브 비디오를 스트리밍하는 방법은 무엇입니까?

분류에서Dev

Android에서 비디오에 텍스트를 추가하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    URL에서 오디오를 스트리밍 / 다운로드 및 재생하는 방법은 무엇입니까?

  2. 2

    Windows 10에서 Python (다운로드하지 않고)의 Youtube URL에서 오디오를 스트리밍하는 방법은 무엇입니까?

  3. 3

    iOS 13에서 원격 오디오를 스트리밍하는 방법은 무엇입니까? (SwiftUI)

  4. 4

    YouTube, Dailymotion, Vimeo 등과 같은 사이트에서 플래시 (스트리밍) 비디오를 다운로드하는 방법은 무엇입니까?

  5. 5

    YouTube, Dailymotion, Vimeo 등과 같은 사이트에서 플래시 (스트리밍) 비디오를 다운로드하는 방법은 무엇입니까?

  6. 6

    YouTube, Dailymotion, Vimeo 등과 같은 사이트에서 플래시 (스트리밍) 비디오를 다운로드하는 방법은 무엇입니까?

  7. 7

    WebRTC 오디오를 Icecast 서버로 스트리밍하는 방법은 무엇입니까?

  8. 8

    URL에서 비디오를 스트리밍하는 동안 오디오 또는 비디오 만 캡처하는 방법은 무엇입니까?

  9. 9

    텍스트와 비디오를 동시에 스트리밍하는 방법은 무엇입니까?

  10. 10

    브라우저에서 인터넷 라디오를 스트리밍하는 방법은 무엇입니까?

  11. 11

    브라우저에서 인터넷 라디오를 스트리밍하는 방법은 무엇입니까?

  12. 12

    iPhone에서 비디오를 스트리밍하는 방법은 무엇입니까?

  13. 13

    FFMPEG에서 입력 오디오를 트리밍하는 방법은 무엇입니까?

  14. 14

    Android 모바일에서 웹 사이트로 오디오를 스트리밍하는 방법은 무엇입니까?

  15. 15

    웹 사이트에서 모든 비디오를 다운로드하는 방법은 무엇입니까?

  16. 16

    웹 사이트에서 비디오 다운로드를 비활성화하는 방법은 무엇입니까?

  17. 17

    Android에서 RTSP 링크를 사용하여 비디오를 라이브 스트리밍하는 방법은 무엇입니까?

  18. 18

    nodejs를 사용하여 cloudinary에서 비디오를 다운로드하는 방법은 무엇입니까?

  19. 19

    입력 오디오를 트리밍 한 다음 단일 ffmpeg 명령에서 비디오의 실제 오디오로 바꾸는 방법은 무엇입니까?

  20. 20

    iPhone 사진 라이브러리에 비디오를 다운로드하는 방법은 무엇입니까?

  21. 21

    자막이있는 YouTube에서 비디오를 다운로드하는 방법은 무엇입니까?

  22. 22

    URLSession을 사용하여 비디오를 다운로드하고 appcelerator titanium에서 저장하고 재생하는 방법은 무엇입니까?

  23. 23

    Linux에서 rtmp 비디오 스트림을 다운로드하는 방법은 무엇입니까?

  24. 24

    html 폴더 외부에서 오류없이 비디오를 스트리밍하는 방법은 무엇입니까?

  25. 25

    Android에서 다중 파일 오디오 레코드를 병합하는 방법은 무엇입니까?

  26. 26

    URL에서 AAC 오디오를 녹음하는 방법은 무엇입니까?

  27. 27

    YouTube에서 오디오가 포함 된 720p 이상의 비디오를 다운로드하는 방법은 무엇입니까?

  28. 28

    DJI Professional 3 카메라에서 라이브 비디오를 스트리밍하는 방법은 무엇입니까?

  29. 29

    Android에서 비디오에 텍스트를 추가하는 방법은 무엇입니까?

뜨겁다태그

보관