【问题标题】:Downloading online audio stream and saving it in parts下载在线音频流并分段保存
【发布时间】:2016-03-08 10:34:01
【问题描述】:

我正在尝试下载音频流并将其保存为 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();
            }
        }
    });

我知道使用 Thread 并不是最好的解决方案,但这不是本文的目的。有什么原因导致这些片段不能完美地相互契合吗?

【问题讨论】:

  • “是否有任何原因导致片段不能完美地相互匹配” - 因为重新连接需要时间。也许甚至10秒? Idk mp3 格式以及您是否可以简单地将流切成小块(怀疑),但您需要找到一个不会关闭InputStream 的解决方案。

标签: java android audio audio-streaming audio-recording


【解决方案1】:

音频部分之间的差距可能是由于连接被关闭和重新打开。

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

【讨论】:

  • 确实有道理。我会试试这个并会报告。
  • 在 while 循环中检查 bytesRead 是否为 250.000 字节,如果是,我现在创建一个新的 FileOutputStream。这确实解决了问题。谢谢!
猜你喜欢
  • 2022-11-14
  • 2011-05-23
  • 2019-11-26
  • 2017-04-26
  • 2020-02-14
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多