use*_*538 23 avfoundation ios avplayer
使用AVPlayer时,是否可以将带有http请求的标头发送到音频文件?我需要能够在服务器收到时检查标头的内容,以限制对所请求文件的访问.
nai*_*tuw 54
您可以使用AVURLAssetHTTPHeaderFieldsKey
的AVURLAsset
的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拒绝.
您需要通过通用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)
在 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)
我花了数周时间寻找一种方法来正式为 HLS 视频流执行此操作。对于任何正在寻找一种同时适用于播放列表和块请求的请求和响应的方法的人来说,我发现有效的唯一方法是通过反向代理传递播放请求,这样您就可以拦截请求,添加标头,将其发送到真实服务器,然后从响应中提取标头,然后将其返回到 AVPlayer。
我在这里制作了一个简单的示例项目(带有大量注释和文档): https ://github.com/kevinjameshunt/AVPlayer-HTTP-Headers-Example
归档时间: |
|
查看次数: |
14610 次 |
最近记录: |