set_sequential_download()
将按顺序要求件。然而:
- 并非所有同行都拥有所有作品。如果您要下载的下一个片段是 3,而您的一个对等节点没有 3,但下一个是 5,则 libtorrent 将开始从该对等节点请求来自第 5 个片段的块。
- 对等点提供不同的上传速率,这意味着一些对等点会比其他对等点更快地满足您的请求。
这使得零件可以无序完成。
set_piece_deadline()
是一种更灵活的方式来指定件优先级。它支持任意范围请求(如 Jacob Zelek 所述)。不过,它的主要特点是它使用不同的方法来请求块。它不是一次考虑一个对等点,而是询问“我应该从这个对等点请求什么”,而是一次考虑一个块,询问“我应该从哪个对等点请求这个块”。
这使得它故意尝试按照截止日期的顺序完成作品。它仍然是基于对等点的历史下载率的估计,如果下载率的瓶颈是你自己的下载能力,那么对对等点未来的下载率进行预测可能会非常困难。使用 `set_piece_deadline()` API 时要记住的一些重要事项是:
- 截止日期是否在未来并不重要。如果在当前下载或上传容量的情况下无法满足截止日期,则将按照要求完成的顺序优先处理这些作品。
- 如果截止日期在未来很远,libtorrent 可能会等待优先考虑它,直到它认为需要请求它才能达到截止日期。如果您正在流式传输一个大文件,并且您知道比特率,您可以为每个片段设置截止日期,如果您的容量高于比特率,您仍然会以稀有优先顺序请求一些片段。提高群体质量。
- 在流式传输数据时,预读绝对至关重要。如果您在想要作品之前不设定截止日期,那么您将永远落后。在请求一件作品和完成它之间通常有相当长的往返时间。如果您不让请求管道充满截止日期,libtorrent 将再次开始请求其他部分,并且您将获得与高优先级部分交错的非优先部分。您可能应该保留几秒钟和至少几部分作为预读。对于视频,我想几十兆字节是合适的(但实验和测量是调整它的最佳方式)。
如果您实际上希望通过 HTTP 将视频流式传输到播放器或 Web 浏览器,您可能需要查看(或使用并向其提交拉取请求):
https://github.com/arvidn/libtorrent-webui/blob/master/src/file_downloader.cpp
这是一个适合该存储库中简单 http 框架的文件下载器提供程序。
更新:
如果您只想保证片段 1 在片段 2 之前完成(不惜一切代价,特别是性能非常差),您可以将所有片段的优先级设置为 0,除了您要下载的片段。完成后,您将收到警报通知,您可以将下一个您想要的优先级设置为 1。依此类推。
这将非常慢,因为你会不断地暂停下载,并处于不断的游戏结束模式(如果一个速度很慢,你可以从多个对等点下载相同的块)。例如,如果您的对等点多于一个块中的块数,您将无法从所有对等点请求下载带宽。