问题标签 [avassetresourceloaderdelegate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
884 浏览

ios - iOS 上 AAC 音频文件的 UTI(统一类型标识符)是什么?

我需要知道AAC 音频文件的统一类型标识符是什么。

上下文:我正在构建一个使用 HLS 播放 DRM'd AAC 文件的音频播放器应用程序。我想支持离线播放,但我不想使用 AVFoundation 的离线内容(通过AVAssetDownloadTask),因为它会在需要回收磁盘空间时从我下面删除文件(根据这个 WWDC 2016 session)。因此,我自己下载文件,并在需要时使用(在此处AVAssetResourceLoaderDelegate演练)从磁盘而不是网络提供文件。但玩家只是永远缓冲。我尝试在不涉及 HLS 的情况下提供一个普通的、未加密的 AAC 文件,但它以同样的方式失败了。我尝试了一个普通的、未加密的 MP3 文件,它可以工作。我将提供的UTI从正确更改为loadingRequest.contentInformationRequest.contentTyperesourceLoader:shouldWaitForLoadingOfRequestedResource:audio.mp3audio.aac它以同样的方式失败了。由此我推断我需要的是 AAC 文件的正确 UTI。

更新:有趣的是,public.aifc-audiopublic.aac-audio努力播放未加密的 AAC 音频文件,但不是涉及 HLS 的加密文件。

0 投票
1 回答
1532 浏览

swift - HLS 流使用 AVAssetResourceLoaderDelegate TS 片段请求缺少 Cookie 标头

我正在使用AVAssetResourceLoadingDelegate拦截 HLS 清单的所有清单请求

在委托中,我自己使用所有清单请求URLSession并将响应返回给AVAssetResourceLoadingRequest

此流使用相当标准的身份验证过程进行保护:

对主清单的请求是使用附加的令牌查询参数发出的。对主清单的响应包括一个 set-cookie 标头。在 set-cookie 响应标头上指定域的每个后续请求都在其请求标头中包含 cookie。

我发现通过委托发出的所有请求都将 cookie 添加到标头中,但由于委托不能用于 TS 段,因此没有添加 cookie。

有谁知道一种方法来强制AVURLAsset始终使用对主清单的响应提供的 cookie 标头来处理在外部发出的请求AVAssetResourceLoaderDelegate

由于我确实提供了URLResponse支持,AVAssetResourceLoadingRequest并且我知道您可以使用 URLSessionConfiguration 的 、 和 属性将 cookie 添加httpShouldAccpetCookieshttpCookieAcceptPolicyURLSession httpCookieStorage。我不认为这超出了可能性范围。

我也知道AVURLAssetHTTPCookiesKey可以将其添加到实例化中,AVURLAasset但在发出主清单请求之前我没有 cookie。

0 投票
1 回答
1033 浏览

ios - 如何使用 AVAssetDownloadTask 下载尚未流式传输的 FairPlay 加密的 AVURLAsset 实例?

我正在尝试使用AVAssetDownloadTask离线下载和播放 FairPlay 加密的音频内容。我不断收到这样的错误urlSession:task:didCompleteWithError:

Error Domain=AVFoundationErrorDomain Code=-11863 "Operation Stopped" UserInfo={NSLocalizedFailureReason=此内容不再可用。, NSLocalizedDescription=Operation Stopped}

我的流程是:

所有这些都有效,并且以与 Apple 的HLSCatalog 示例代码相同的方式完成。但是下载仍然会给我上述错误,即使将相同的播放列表和关键 URL 插入示例代码可以正常下载。

我最终发现的是,它AVAssetDownloadTask只会下载一个已经流式传输并给出其解密密钥(通过)且与播放器无关的AVURLAsset 实例。AVAssetResourceLoaderDelegate我不能只AVURLAsset使用与已经播放的 URL 相同的 URL 制作新的并下载它。所以看来,为了下载任意 FairPlay 内容,我必须:

  • 做一个AVURLAsset
  • 制作一个AVPlayer并将其音量设置为0
  • 给它资产并播放它
  • 等到它从资源加载器请求它的密钥并开始播放
  • 将其交给下载任务并将其与播放器解除关联

但这似乎很可怕。这不可能是真的。

所以,我的问题是:我如何下载一个 FairPlay 加密的 AVURLAsset 而之前没有流式传输它的特定实例?

0 投票
0 回答
87 浏览

avplayer - iOS12下视频无法正常播放

我正在使用 AVAssetResourceLoader 加载数据和 AVPlayerViewController 来播放。它在iOS10、11下可以正常工作,但在iOS12下就不行了。播放时,进程条向前移动,但视频只播放1秒,一直卡到最后。

这是我的 AVAssetResourceLoader 代码:

0 投票
1 回答
488 浏览

ios - Fairplay 停止在 iOS 12.4 和 13 上运行

我有代码可以从我的应用程序中播放加密的 Fairplay 流,它在 iOS 12.4 之前运行良好。我使用从请求中AVAssetResourceLoaderDelegate获取然后从请求中提取 SPC 并发出 http 请求以获取 CKC。AVAssetResourceLoadingRequestresourceLoader:shouldWaitForLoadingOfRequestedResource:

但是在新的 iOS 12.4 上,加载请求被取消并 resourceLoader:didCancelLoadingRequest:在之后被调用resourceLoader:shouldWaitForLoadingOfRequestedResource:,我的播放器保持在加载状态,没有错误。在测试版 iOS 13 上的行为相同。清晰的流是可播放的,而只有加密流的问题。

有人遇到过这个问题吗?我应该迁移AVContentKeySession到加载密钥吗?

0 投票
0 回答
388 浏览

ios - 调用 AVAssetResourceLoadingRequest 的 finishLoadingWithError(err) 时如何强制 AVPlayer 失败

我想通过 playerFailedToReachEnd 通知或通过 KVO 观察 player.status 强制 AVPlayer 抛出播放器错误,当在通过 AVAssetResourceLoader 加载资源请求的过程中请求完成加载错误时。

它不应该在 AVPlayer 上进行手动播放停止,以避免处理手动停止和 KVO/通知之间的竞争条件

避免发生错误时在 AVPlayer 上手动停止播放以避免竞争条件。

尝试返回回调“resourceLoader:shouldWaitForLoadingOfRequestedResource:”的部分以返回 NO 它不会使 AVPlayer 将状态更改为失败,也不会发送有关播放器失败的通知

在调用 AVAssetResourceLoadingRequest.finishLoadingWithError() 时预期 AVPlayer 将发送失败通知或 KVO 状态更改

实际 AVPlayer 没有状态变化也没有失败通知

0 投票
1 回答
641 浏览

ios - HTTPS 的 AVPlayer URL 自定义加载

我正在尝试使用AVPlayer自定义 URL 加载(自定义NSURLProtocol子类)。但它似乎[NSURLProtocol registerClass]不适用于真实设备中的 AVPlayer(请参阅此线程)。

现在我正在尝试使用AVAssetResourceLoaderDelegate来进行自定义 URL 加载。但是,如何触发委托对我来说有点令人困惑。我处理的 URL 看起来像这样https://some_ip_address:port/resource/,但似乎我的委托没有被调用来获取这样的 URL。我试图将方案更改为非 HTTP(例如“quic”)并且能够触发委托代码,但我真的不想破解该方案。

以下是相关代码:

(委托在不同的文件中实现)

有了上述内容,如果 url 具有“https”方案,我看不到在委托中触发了任何方法。我缺少什么来允许委托为“https”URL 进行自定义 URL 加载?

谢谢