下载在线音频流并将其保存在零件中

问题描述:

我试图下载一个音频流并将其保存在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

音频部分之间的间隙可能是由于被关闭并重新打开所述连接。

你为什么不保持连接打开所有的时间,并使用一个缓冲输出流写入到一个文件?您可以编写自己的输出流(通过扩展常规缓冲区)并将其写入文件。一旦达到250kb,它可以决定关闭该文件并重新打开一个新文件,同时将音频缓存到内存中。

+0

这确实有道理。我会尝试这个,并会回报。 – Marc

+0

如果bytesRead是250.000字节,则在while循环内检查,如果是这样,我现在创建一个新的FileOutputStream。这确实解决了这个问题。谢谢! – Marc