为 AVURLAssets 设置 HTTP 标头字段

Posted

技术标签:

【中文标题】为 AVURLAssets 设置 HTTP 标头字段【英文标题】:Setting HTTP Header Fields for AVURLAssets 【发布时间】:2018-08-11 07:05:40 【问题描述】:

我正在尝试加载需要标头中的令牌的视频文件。我在 Stackverflow 上了解到,这可能是通过查看以下 question 来实现的。问题是我不相信 AVURLAssetHTTPHeaderFieldsKey 是公开的,或者我的资产变量写错了。我想要做的是将令牌添加到标题中,以便 AVPlayer 加载视频文件。到目前为止,这是我的代码,它只显示播放器,但不加载我猜的视频,因为我的标题设置不正确:

NSURL *videoURL = [NSURL URLWithString:cell.media[@"redirectionUrl"]];

        NSMutableDictionary * headers = [NSMutableDictionary dictionary];
        [headers setObject:[CMUser currentUser].token forKey:@"Authorization"];

        AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoURL options:@@"AVURLAssetHTTPHeaderFieldsKey" : headers];


        AVPlayerItem * item = [AVPlayerItem playerItemWithAsset:asset];

        AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:item];

        AVPlayerViewController *playerViewController = [AVPlayerViewController new];

        playerViewController.player = player;

        playerViewController.modalPresentationStyle = UIModalPresentationOverFullScreen;

        [self presentViewController:playerViewController animated:YES completion:nil];  

【问题讨论】:

您的代码似乎没有问题,请先尝试从邮递员那里获取视频。如果你从邮递员那里得到它,那么你的代码可能会出现一些问题,在完成块中显示控制器尝试通过调用“playerViewController.player.play()”进行播放之后 【参考方案1】:

您的代码一切正常。这可能会在授权令牌中发出。

请检查以下代码,它与您的完全相同。 *在斯威夫特 4.0

    //MARK:- setting player
    fileprivate func setPlayRemoteUrl() 

        if playUrl == nil || playUrl == "" 
            return
        
        removeAllObserver()
        resettingObject()

        let headerFields: [String:String] = ["User-Agent":"6y2zxABAb8oqeNec"]
        let asset: AVURLAsset = AVURLAsset.init(url: URL(string: self.playUrl)!, options: ["AVURLAssetHTTPHeaderFieldsKey": headerFields])
        self.playerItem = AVPlayerItem(asset: asset)
        self.player = AVPlayer.init(playerItem: playerItem)

        playerLayer = AVPlayerLayer(player: player)
        playerLayer?.videoGravity = AVLayerVideoGravity.resizeAspect
        playerLayer?.contentsScale = UIScreen.main.scale
        layer.insertSublayer(playerLayer!, at: 0)
        setAllObserver()
    

【讨论】:

"AVURLAssetHTTPHeaderFieldsKey" 为私钥,使用此应用在尝试上传时会被 App Store 拒绝。 不会。不能使用函数调用等私有API,但是可以使用key。我的任何应用都没有因此而被拒绝。

以上是关于为 AVURLAssets 设置 HTTP 标头字段的主要内容,如果未能解决你的问题,请参考以下文章

为 iframe 设置自定义 HTTP 请求标头

Apache Solr:从 solrconfig.xml 为 CORS 设置 HTTP 响应标头

通过 .htaccess 文件为所有 PHP 脚本设置 HTTP 标头

为 iOS MobileFirst ResourceRequest 适配器调用设置 HTTP 标头失败

当请求 API 的自定义标头错误时,将 http 状态代码设置为 417

DropBox API 应用程序/八位字节流标头