如何在 iOS 上下载 LIVE HLS m3u8 流
Posted
技术标签:
【中文标题】如何在 iOS 上下载 LIVE HLS m3u8 流【英文标题】:How to download a LIVE HLS m3u8 stream on iOS 【发布时间】:2015-10-18 13:17:01 【问题描述】:HLS 流可以是“直播”或“VOD”。下载 VOD HLS 流很容易。
但是,我想下载(或录制)5 分钟的 LIVE HLS 流。这可能吗?
如果我这样做,我确信我必须对 m3u8 文件进行重大更改...原因之一是直播流没有“持续时间”,但我下载的流必须作为 VOD 流式传输,所以它必须有一个持续时间。我可能不知道还需要进行各种其他更改。估计 ts 段的 URL 也需要更改。
任何提示或建议(希望是实际代码!)?
谢谢!
PS。请注意,这个问题不是关于在离线模式下播放流 - 我知道我需要一个 HTTP 服务器。
【问题讨论】:
不太清楚您要做什么。你对服务器有控制权吗?还有第三种类型的 HLS 播放列表 - 事件类型。它会在片段到达时将它们添加到播放列表中,这意味着您可以随时来回搜索,并且在最终片段到达后,它仍可作为 VOD 使用。 @aergistal 我无法控制服务器。这些流是“实时”m3u8 流,我想在客户端记录它们。客户端我的意思是在 ios 应用程序上。 “录制”意味着下载 m3u8 及其所有 ts 段。您确实是正确的,我可以将其保存为 VOD OR EVENT 播放列表。两者都适合我。但我希望代码下载/记录流,并更改播放列表类型和对本地 URL 的引用。然后我将允许通过本地 http 服务器播放。 【参考方案1】:实时播放列表使用滑动窗口。您需要在目标持续时间后定期重新加载它,并仅下载列表中出现的新片段(它们将在稍后被删除)。
保存每个片段的#EXTINF
,并开始使用相同的目标持续时间和从 0 开始的媒体序列将它们写入 VOD 播放列表。
如果您想停止录制,请在末尾添加EXT-X-ENDLIST
标签。
只要您在m3u8
中使用相同的名称,您如何命名您的分段并不重要。
【讨论】:
这很有帮助,但我已经这样做了并且它有效——但并非总是如此。这有点复杂。您需要继续下载片段(segs),但是您可能会发现某些片段由于 n/w 延迟而需要更长的时间来下载。所以你可能会丢失一些数据包。每个 seg 的持续时间可能不准确,因此当您构建索引 m3u8 时,您需要重新检查所有 seg 以获得正确的持续时间。最后,你可能需要对同一个 seg 多次尝试 d/loading(如果它失败),并且可能最终在那个时候丢失其他 segs(需要多线程)。任何源代码都会很有帮助。 您需要使用线程和下载队列。这些片段保留播放列表持续时间的两倍,因此您有足够的时间。您可以在录制结束时查看时长并写入播放列表。 是的,我也这样做了。还是断了。我认为编写此代码以 100% 的时间工作可能相当复杂,但我仍然赞成。似乎有几个人遇到过这个问题:***.com/questions/6671705/… 源代码最好标记为已回答。 @CarlosF 这不是它的工作原理。在 *** 上,提问者必须发布导致问题的相关源代码。添加它会提高您获得特定答案的机会。 好吧,我有 Ruby 中的代码......不是 iOS,并且对你的答案投了赞成票。在我的问题中,我已经指出源代码是理想的。我很清楚该做什么的理论方面。本质上,您正在构建一个写入磁盘而不是屏幕的播放器。以上是关于如何在 iOS 上下载 LIVE HLS m3u8 流的主要内容,如果未能解决你的问题,请参考以下文章