如何通过 GCDWebServer 在 iOS 上播放本地 M3u8 文件

Posted

技术标签:

【中文标题】如何通过 GCDWebServer 在 iOS 上播放本地 M3u8 文件【英文标题】:How to play local M3u8 files on iOS through GCDWebServer 【发布时间】:2016-03-08 09:41:59 【问题描述】:

我正在尝试运行本地 GCDWebServer 来提供我从服务器本地存储的 M3U8 文件。我解析了文件并将每个 .ts 文件保存到本地存储。现在我正在尝试通过本地 Web 服务器提供该文件,但我无法使用 MPMoviePlayerController 或 AVPlayerViewController 播放该文件。

这是我的服务器代码:

webServer = [[GCDWebServer alloc] init];

[webServer addDefaultHandlerForMethod:@"GET"
                         requestClass:[GCDWebServerRequest class]
                         processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) 

                             NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                             NSString *docDirectory = [paths objectAtIndex:0];
                             NSString *textPath = [docDirectory stringByAppendingPathComponent:@"localPlaylist.m3u8"];
                             return [GCDWebServerDataResponse responseWithData:[NSData dataWithContentsOfFile:textPath] contentType:@".m3u8"];
                         ];

[webServer startWithPort:8080 bonjourName:nil];

以及我随后尝试播放的代码:

 AVPlayerViewController *newPlayer = [[AVPlayerViewController alloc] init];
newPlayer.player = [[AVPlayer alloc]initWithURL:webServer.serverURL];
[self presentViewController:newPlayer animated:YES completion:nil];

我在提供本地 m3u8 文件的方式上是否做错了什么?此外,运行本地 Web 服务器是否是托管内容的安全方式?

【问题讨论】:

你有没有成功播放本地保存的 m3u8 文件和加密/解密的块?我目前正在处理相同的流程,需要一些指导。 【参考方案1】:

将您的 content-type 更改为 application/vnd.apple.mpegurl,如 RFC 部分 3.1

所述

【讨论】:

【参考方案2】:
NSString *somePath = @"path/to/folder/with/your/playlist";

GCDWebServer *webServer = [[GCDWebServer alloc] init];
[webServer addGETHandlerForBasePath:@"/" directoryPath:somePath indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
[webServer start];

编辑:

通过网络服务器的这种设置,对服务器地址的请求将返回directoryPath中指出的文件夹的文件列表。所以启动 HLS 流的链接看起来像 http://server_local_address/playlist.m3u8

【讨论】:

以上是关于如何通过 GCDWebServer 在 iOS 上播放本地 M3u8 文件的主要内容,如果未能解决你的问题,请参考以下文章

iOS:GCDWebServer 在设备上不起作用

如何从 iOS 应用程序内将 GCDWebServer 请求重定向到外部主机

如何向 GCDWebServer 请求发送两个响应

如何限制连接到 GCDWebServer 中允许的 IP

区分 GCDWebServer 中的表单操作?

GCDWebServer 如何在请求中添加自定义参数(GET/POST)