播放列表文件(m3u8)无限地提供另一个播放列表文件,而不提供任何媒体文件



我有一个播放列表文件,它给了我另一个播放清单文件,它也给了我另外一个连续的播放清单文件
如何播放此播放列表文件?我在哪里可以找到视频的来源?

例如,我有一个播放列表文件。那是

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=355670
http://slive.ytn.co.kr:1935/live/ylive_0624_1.sdp/playlist.m3u8?wowzasessionid=195968950

如果我访问http://slive.ytn.co.kr:1935/live/ylive_0624_1.sdp/playlist.m3u8?wowzasessionid=195968950,它会给我其他播放列表文件。

#EXTM3U
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:894
#EXTINF:11,
media_894.ts?wowzasessionid=195968950
#EXTINF:10,
media_895.ts?wowzasessionid=195968950
#EXTINF:11,
media_896.ts?wowzasessionid=195968950

如果我访问结果,它还会给我播放列表文件。

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=373764
http://slive.ytn.co.kr:1935/live/ylive_0624_1.sdp/playlist.m3u8?wowzasessionid=1093961187
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=382539
http://slive.ytn.co.kr:1935/live/ylive_0624_1.sdp/playlist.m3u8?wowzasessionid=1566364859
etc...

虽然我可以在我的iphone中播放safari中的url http://slive.ytn.co.kr:1935/live/ylive_0624_1.sdp/playlist.m3u8?wowzasessionid=195968950,但我想在我自己的iphone应用程序中播放这个url
如何自己玩m3u8文件扩展名?

EDIT-可能是这个SO问题的重复,但如果你想持久保存文件,你需要采取下面列出的艰难方法。

简单方法=在应用程序中嵌入UIWebView,并使用.m3u8文件的url对其进行初始化。这将打开理解m3u8的quicktime,它将在下载时播放它。

Hard-way=手动为m3u8会话的每个部分创建请求/响应,然后依次从播放列表文件下载每个.ts文件。当你得到视频的每个"块"时,把它写到一个文件或内存中,然后在它后面附加下一个"块"。我为一个h.264编码的.m4v文件做了这件事,用作m3u8,它起了作用(我的代码太难看了,无法粘贴),但伪代码是:

  1. 获取m3u8,保存发送的任何cookie和可能重要的任何标头*
  2. 解析.m3u8(第一个文件,#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWITH=373764)并提取我们的URL
  3. 从.m3u8文件中的一个URL获取播放列表(请确保在请求中保留任何必要的头/cookie)
  4. 分析播放列表文件,从文件的顶部保存尽可能多的元数据,为每个.ts路径构造一个绝对的URL,然后将其填充到一个数组中
  5. 在数组上迭代(再次注意cookies/headers),并将每个.ts URL的内容提取到一个文件中
  6. 使用您选择的任何媒体框架播放下载的文件(搜索SO了解如何执行此操作)

如果你只需要播放文件,那就走简单的路线。如果你需要坚持下去,你需要跳m3u8舞。

*HTTP Scoop对于了解m3u8"协议"的工作方式以及确保您的请求/响应标头是准确的来说是非常宝贵的http://tuffcode.com/

*我使用了普通的NSURLConnection同步调用,因为我的代码只是概念的证明,其他网络框架,如AFNetworking,会让这变得更容易。

最新更新