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

时间:2012-02-25 05:00:34

标签: iphone media-player playlist m3u

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

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

#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中播放网址http://slive.ytn.co.kr:1935/live/ylive_0624_1.sdp/playlist.m3u8?wowzasessionid=195968950,但我想在自己的iphone应用中播放此网址。
我怎么能自己玩m3u8文件扩展名?

1 个答案:

答案 0 :(得分:1)

编辑 - 可能是this SO question的副本,但如果您想要保留该文件,则需要按照下面列出的方式进行。

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

硬路=手动为m3u8会话的每个部分创建请求/响应,然后从播放列表文件依次下载每个.ts文件。当您获得视频的每个“块”时,将其写入文件或内存,然后在其后附加下一个“块”。我已经为一个h.264编码的.m4v文件做了这个,作为一个m3u8,它工作(我的代码太难看了,粘贴)但伪代码是:

  1. 获取m3u8,保存发送的任何Cookie以及任何可能重要的标头*
  2. 解析.m3u8(第一个文件,#EXT-X-STREAM-INF:PROGRAM-ID = 1,BANDWIDTH = 373764)并拉出我们的网址。
  3. 从.m3u8文件中的一个网址获取播放列表(确保在请求中保留可能必需的任何标头/ Cookie)
  4. 解析播放列表文件,从文件顶部保存尽可能多的元数据,为每个.ts路径构建一个绝对URL,然后将其填入数组。
  5. 遍历数组(再次注意cookie /标题)并将每个.ts URL的内容提取到文件中。
  6. 使用您选择的任何媒体框架播放下载的文件(搜索SO以了解如何执行此操作)
  7. 如果您只需要播放文件,请选择简单的路线。如果你需要坚持下去,你需要做m3u8舞蹈。

    * HTTP Scoop对于了解m3u8“协议”的工作方式以及确保请求/响应标头的准确性非常有用 - http://tuffcode.com/

    *我使用了vanilla NSURLConnection同步调用,因为我的代码只是一个概念证明,其他网络框架如AFNetworking将使这更容易。