3

我正在开发一个 Android 应用程序,其目的是从 2 个服务器下载块(视频文件的一部分),在每个服务器下载后按顺序附加它们(到主视频文件中),最后在下载继续时播放这个视频文件。 .

当下载通过使用两个不同的线程(每个服务器一个)执行下载时串行完成时,这很有效。我想知道如何通过并发下载而不是串行下载来实现上述目标。

即同时按顺序从服务器下载块。比如同一时间段从server1下载chunk0、chunk1和chunk2(比方说是server2的3倍),从server2下载chunk3,这样我们在这段时间内完全使用了2台服务器的所有可用带宽时间。并且这个过程重复,直到所有块都被下载。

如上所述,通过使用线程和连接,下载是串行的。为了使其并发,我尝试从每个线程中删除连接,但是它不会按顺序下载块,并且也只从一个服务器下载,而不是从两个服务器下载。AsyncTask 不是一个解决方案,因为它也不会按顺序下载块。

那么,有什么方法可以实现这种并发并按我上面描述的顺序下载块?有没有人做过这样的项目,以便确定答案?

4

1 回答 1

0

您可以使用下载加速器中流行的技术。

一般来说,这个想法是关于使用 Range HTTP 标头从每个服务器请求块。(当服务器能够相应地处理 Range 标头时,服务器会响应 Accept-Ranges 标头)。(这个博客对此有很好的解释)。

每个线程/可运行/可调用都必须知道哪个块是它的责任(第一个字节位置+长度?),因为每个线程都必须在文件中写入自己的部分。

然后将做出决定,您可以:

  1. 在每个线程中使用RandomAccessFile的实例写入文件,显然将文件指针定位在其块的第一个字节位置(使用seek 方法),或者..

  2. 确保您有一个唯一的工作线程(请参阅Executorssubmit)负责写入每个线程告诉的字节。正如在写作的那一刻,你将使用 seek 将文件指针移动到正确的位置,不会有重叠的错误。

注意:如果您希望在拥有第一个块时能够开始播放,您可以通过在第一个块线程下载+写入完成后执行该代码来实现。

于 2013-07-24T04:53:45.167 回答