0

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

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

#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...

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

4

1 回答 1

1

编辑 - 可能是这个 SO 问题的副本,但如果你想保留文件,你需要走下面列出的艰难道路。

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

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

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

如果您只需要播放文件,请走简单的路线。如果你需要坚持他们,你需要做 m3u8 舞蹈。

*HTTP Scoop 对于了解 m3u8“协议”如何工作以及确保您的请求/响应标头是准确的非常宝贵 - http://tuffcode.com/

*I used vanilla NSURLConnection synchronous calls as my code was just a proof of concept, other network frameworks like AFNetworking will make this a lot easier.

于 2012-04-02T13:28:42.010 回答