2016-03-08 36 views
0

我試圖下載一個音頻流並將其保存在250kb的部分中。我通過下載音頻文件,關閉連接並開始250kb的新下載來實現它。但是,當我這樣做時,我錯過了大約10秒鐘的音頻文件之間的音頻。下載在線音頻流並將其保存在零件中

的代碼我使用下載的音頻流中的250KB部分是:

public void downloadMP3() { 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 

       URL url = new URL("http://icecast.omroep.nl/3fm-bb-aac"); 
       InputStream inputStream = url.openStream(); 
       File filemp3 = new File(
         Environment.getExternalStorageDirectory() + "/radiorecordings/file" + fileCount + ".mp4a"); 
       FileOutputStream fileOutputStream = new FileOutputStream(filemp3); 

       int c; 
       int bytesRead = 0; 

       //keep reading until file is 250kb (250.000 bytes) 
       while ((c = inputStream.read()) != -1 && bytesRead < 250000) { 
        Log.d("...", "bytesRead=" + bytesRead); 
        fileOutputStream.write(c); 
        bytesRead++; 
       } 

       fileCount++; 
       downloadMP3(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

我知道使用線程不是最好的解決辦法,但是這不是這是怎麼回事。有什麼理由爲什麼這些碎片不適合彼此?

+0

「沒有任何理由爲什麼片段不完全適合於對方」 - 因爲它需要時間來重新連接。甚至可能10秒? Idk mp3格式,以及是否可以簡單地將流切成片段(懷疑它),但是您需要找到一個不關閉「InputStream」的解決方案。 – zapl

回答

0

音頻部分之間的間隙可能是由於被關閉並重新打開所述連接。

你爲什麼不保持連接打開所有的時間,並使用一個緩衝輸出流寫入到一個文件?您可以編寫自己的輸出流(通過擴展常規緩衝區)並將其寫入文件。一旦達到250kb,它可以決定關閉該文件並重新打開一個新文件,同時將音頻緩存到內存中。

+0

這確實有道理。我會嘗試這個,並會回報。 – Marc

+0

如果bytesRead是250.000字節,則在while循環內檢查,如果是這樣,我現在創建一個新的FileOutputStream。這確實解決了這個問題。謝謝! – Marc

相關問題