在AVPlayer的请求中添加自定义标头字段

use*_*538 23 avfoundation ios avplayer

使用AVPlayer时,是否可以将带有http请求的标头发送到音频文件?我需要能够在服务器收到时检查标头的内容,以限制对所请求文件的访问.

nai*_*tuw 54

您可以使用AVURLAssetHTTPHeaderFieldsKeyAVURLAsset的init选项来修改请求头.

例如:

NSMutableDictionary * headers = [NSMutableDictionary dictionary];
[headers setObject:@"Your UA" forKey:@"User-Agent"];
AVURLAsset * asset = [AVURLAsset URLAssetWithURL:URL options:@{@"AVURLAssetHTTPHeaderFieldsKey" : headers}];
AVPlayerItem * item = [AVPlayerItem playerItemWithAsset:asset];
self.player = [[AVPlayer alloc] initWithPlayerItem:item];
Run Code Online (Sandbox Code Playgroud)

注意:我在WebKit的源代码中找到了此密钥,但这是一个私有选项密钥,因此如果您使用此应用程序,您的应用程序可能会被AppStore拒绝.

  • @JavierGonzalez没有任何问题. (4认同)
  • @AzizJaved还有另一个公共选项`AVURLAssetHTTPCookiesKey`,它似乎符合您的需求. (4认同)
  • 这正是我正在做的事情.有人可以验证Apple是否会因使用此密钥而拒绝该应用程序? (3认同)

Jac*_*kin 9

您需要通过通用HTTP连接机制自行请求数据,例如NSURLConnection.如果NSHTTPURLResponse标题通过了您的测试,那么您应该将其保存NSCachesDirectory到该资源并将该资源的URL传递给AVPlayer类似,以便:

NSData *data = //your downloaded data.
NSString *filePath = //generate random path under NSCachesDirectory
[data writeToFile:filePath atomically:YES];

AVPlayer *player = [AVPlayer playerWithURL:[NSURL fileURLWithPath:filePath]];
//...
Run Code Online (Sandbox Code Playgroud)

  • 不可能干扰AVPlayer所做的http通信,但可以完全接管对HTTP通信的控制,并在不设置HTTP代理的情况下按需向AVPlayer提供数据 - http://vombat.tumblr.com/post/86294492874 /缓存-音频流-使用-avplayer (2认同)
  • @Anurag 很好的解决方案。不幸的是,如果您通过 http 实时流媒体进行流式传输,则这不起作用,因为您无法自己创建 AVAssets,并且必须通过 http 提供 HLS 流。我们为此使用本地 http 服务器。或者您知道没有本地服务器且可与 HLS 配合使用的解决方案吗? (2认同)

min*_*hhq 9

在 Swift 中回答,AVURLAssetHTTPHeaderFieldsKey选项将像魅力一样工作。

 let headers: [String: String] = [
    "custome_header": "custome value"
 ]
 let asset = AVURLAsset(url: URL, options: ["AVURLAssetHTTPHeaderFieldsKey": headers])
 let playerItem = AVPlayerItem(asset: asset)
 player = AVPlayer(playerItem: item)
Run Code Online (Sandbox Code Playgroud)


Kev*_*unt 6

我花了数周时间寻找一种方法来正式为 HLS 视频流执行此操作。对于任何正在寻找一种同时适用于播放列表和块请求的请求和响应的方法的人来说,我发现有效的唯一方法是通过反向代理传递播放请求,这样您就可以拦截请求,添加标头,将其发送到真实服务器,然后从响应中提取标头,然后将其返回到 AVPlayer。

我在这里制作了一个简单的示例项目(带有大量注释和文档): https ://github.com/kevinjameshunt/AVPlayer-HTTP-Headers-Example