使Vimeo视频在iOS中脱机工作

作为Hasso Plattner Institute(HPI)知识技术研究小组的成员,我们正在研究和研究如何使MOOC和基于视频的电子学习脱机工作,因为我们已经了解到,在openHPI的MOOC中,大约有三分之一的用户, openSAP或openWHO下载视频和资料。 除了在具有脱机功能的网站上工作外,我们的研究和工作还涉及针对Android和iOS提供的本地应用程序。

在我们的Android应用中,我们提供SD和HD格式的mp4文件下载。 对于我们的新iOS App,我们决定使用HTTP Live Streaming(HLS)视频(请在apple.com上单击此链接以获取规格和更多内容)。 这是一种非常不错的格式,它基于播放列表,因此它可以包含不同的bandwith版本以及不同的音频和字幕版本。 然后,播放器可以根据语言偏好和可用带宽下载最适合的版本。 如果您在在线时使用HLS,则播放器将尝试使用可能的最佳版本。

从iOS 10开始,Apple引入了允许用户下载HLS视频并稍后播放的可能性。 我们认为这很酷是出于不同的原因。 在没有互联网连接的情况下,在非洲某处上班的通勤者或卫生工作者,均可从此功能中受益。 我是否提到过我们的研究被SAP,WHO和其他机构使用?

我们花了最后两周的时间来实现此功能,而最后四天的调试仅使它无法正常工作。

我们的视频托管在Vimeo上,因此可以从靠近用户的数据中心进行交付。 Vimeo还负责对我们的视频文件进行转码。 如果直接在Vimeo上访问视频文件(不使用其播放器),则可以访问HLS URL,该URL如下所示:

https://player.vimeo.com/external/203790595.m3u8?s=3cb58fb02666fd9b9bd8f14f36d54a45fb29c785

调用此URL时,它将发送HTTP重定向,其中将包含实际文件的URL,例如https://skyfire.vimeocdn.com/1501777916-0x0d0827236aefc32e0894e1f50efad8cb6642e905/224214791/video/786737170,786737168,786737172,786737173173 /master.m3u8?absolute=1

虽然此功能非常适合在线播放此文件,但如果应用下载了文件并尝试在离线时稍后播放,则无法播放视频。 来自不同来源的其他文件运行良好。

最终,我们发现iOSs SDK中的下载功能无法正确处理重定向(已在iOS 10和至少是当前的iOS 11公开Beta中进行了测试)。

我们通过应用中的解决方法解决了此问题:

(请参阅GitHub上的完整提交),方法是手动调用链接,然后将最终URL传递给下载程序。 请注意,正如Vimeo支持人员确认的那样,此解析的链接仅在短时间内有效。

请注意,文件和下载链接都是通过HTTP 302重定向到实际视频文件资源的。 实际视频文件资源的位置每隔几个小时就会过期,因此请确保始终使用我们提供的重定向链接。

希望这篇文章能帮助其他人在遇到相同问题时绊倒一些时间。

我们向Apple提出了一个错误,但即使他们为新的iOS版本修复了该错误,旧版本仍会保持这种行为。

更新1 —新解决方案

尽管上述方法允许离线观看已下载的视频,但是当设备连接到Internet并且远程链接过期后(大约一天后),播放将失败。 我们认为这是由于某种原因设备尝试在线获取播放列表的原因,如果网址过期,则会中断。

我们知道从应用程序中删除了重定向处理代码,而是构建了HLS代理。 因此,我们可以为该应用提供未过期的链接。 然后,此链接从vimeo中获取播放列表,然后让它通过。 请注意,我们也正在操纵单个流,不知道是否可行,但是通过这种方式,我们可以控制所有URL。