问题标签 [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.
ios - iOS 上 AAC 音频文件的 UTI(统一类型标识符)是什么?
我需要知道AAC 音频文件的统一类型标识符是什么。
上下文:我正在构建一个使用 HLS 播放 DRM'd AAC 文件的音频播放器应用程序。我想支持离线播放,但我不想使用 AVFoundation 的离线内容(通过AVAssetDownloadTask
),因为它会在需要回收磁盘空间时从我下面删除文件(根据这个 WWDC 2016 session)。因此,我自己下载文件,并在需要时使用(在此处AVAssetResourceLoaderDelegate
演练)从磁盘而不是网络提供文件。但玩家只是永远缓冲。我尝试在不涉及 HLS 的情况下提供一个普通的、未加密的 AAC 文件,但它以同样的方式失败了。我尝试了一个普通的、未加密的 MP3 文件,它可以工作。我将提供的UTI从正确更改为loadingRequest.contentInformationRequest.contentType
resourceLoader:shouldWaitForLoadingOfRequestedResource:
audio.mp3
audio.aac
它以同样的方式失败了。由此我推断我需要的是 AAC 文件的正确 UTI。
更新:有趣的是,public.aifc-audio
并public.aac-audio
努力播放未加密的 AAC 音频文件,但不是涉及 HLS 的加密文件。
swift - HLS 流使用 AVAssetResourceLoaderDelegate TS 片段请求缺少 Cookie 标头
我正在使用AVAssetResourceLoadingDelegate
拦截 HLS 清单的所有清单请求
在委托中,我自己使用所有清单请求URLSession
并将响应返回给AVAssetResourceLoadingRequest
此流使用相当标准的身份验证过程进行保护:
对主清单的请求是使用附加的令牌查询参数发出的。对主清单的响应包括一个 set-cookie 标头。在 set-cookie 响应标头上指定域的每个后续请求都在其请求标头中包含 cookie。
我发现通过委托发出的所有请求都将 cookie 添加到标头中,但由于委托不能用于 TS 段,因此没有添加 cookie。
有谁知道一种方法来强制AVURLAsset
始终使用对主清单的响应提供的 cookie 标头来处理在外部发出的请求AVAssetResourceLoaderDelegate
?
由于我确实提供了URLResponse
支持,AVAssetResourceLoadingRequest
并且我知道您可以使用 URLSessionConfiguration 的 、 和 属性将 cookie 添加httpShouldAccpetCookies
到httpCookieAcceptPolicy
URLSession httpCookieStorage
。我不认为这超出了可能性范围。
我也知道AVURLAssetHTTPCookiesKey
可以将其添加到实例化中,AVURLAasset
但在发出主清单请求之前我没有 cookie。
ios - 如何使用 AVAssetDownloadTask 下载尚未流式传输的 FairPlay 加密的 AVURLAsset 实例?
我正在尝试使用AVAssetDownloadTask
离线下载和播放 FairPlay 加密的音频内容。我不断收到这样的错误urlSession:task:didCompleteWithError:
:
Error Domain=AVFoundationErrorDomain Code=-11863 "Operation Stopped" UserInfo={NSLocalizedFailureReason=此内容不再可用。, NSLocalizedDescription=Operation Stopped}
我的流程是:
AVURLAsset
使用类似的 URL创建一个https://my.cdn.com/playlist.m3u8
- 设置其资源加载器的委托
- 以
AVPlayerItem
- 使用 中的方法,
AVAssetResourceLoaderDelegate
查找以方案开头的 URLskd
,下载 CKC,获取可持久化的表单,并将其交给资源加载器请求
所有这些都有效,并且以与 Apple 的HLSCatalog 示例代码相同的方式完成。但是下载仍然会给我上述错误,即使将相同的播放列表和关键 URL 插入示例代码可以正常下载。
我最终发现的是,它AVAssetDownloadTask
只会下载一个已经流式传输并给出其解密密钥(通过)且与播放器无关的AVURLAsset
实例。AVAssetResourceLoaderDelegate
我不能只AVURLAsset
使用与已经播放的 URL 相同的 URL 制作新的并下载它。所以看来,为了下载任意 FairPlay 内容,我必须:
- 做一个
AVURLAsset
- 制作一个
AVPlayer
并将其音量设置为0 - 给它资产并播放它
- 等到它从资源加载器请求它的密钥并开始播放
- 将其交给下载任务并将其与播放器解除关联
但这似乎很可怕。这不可能是真的。
所以,我的问题是:我如何下载一个 FairPlay 加密的 AVURLAsset 而之前没有流式传输它的特定实例?
avplayer - iOS12下视频无法正常播放
我正在使用 AVAssetResourceLoader 加载数据和 AVPlayerViewController 来播放。它在iOS10、11下可以正常工作,但在iOS12下就不行了。播放时,进程条向前移动,但视频只播放1秒,一直卡到最后。
这是我的 AVAssetResourceLoader 代码:
ios - Fairplay 停止在 iOS 12.4 和 13 上运行
我有代码可以从我的应用程序中播放加密的 Fairplay 流,它在 iOS 12.4 之前运行良好。我使用从请求中AVAssetResourceLoaderDelegate
获取然后从请求中提取 SPC 并发出 http 请求以获取 CKC。AVAssetResourceLoadingRequest
resourceLoader:shouldWaitForLoadingOfRequestedResource:
但是在新的 iOS 12.4 上,加载请求被取消并 resourceLoader:didCancelLoadingRequest:
在之后被调用resourceLoader:shouldWaitForLoadingOfRequestedResource:
,我的播放器保持在加载状态,没有错误。在测试版 iOS 13 上的行为相同。清晰的流是可播放的,而只有加密流的问题。
有人遇到过这个问题吗?我应该迁移AVContentKeySession
到加载密钥吗?
ios - 调用 AVAssetResourceLoadingRequest 的 finishLoadingWithError(err) 时如何强制 AVPlayer 失败
我想通过 playerFailedToReachEnd 通知或通过 KVO 观察 player.status 强制 AVPlayer 抛出播放器错误,当在通过 AVAssetResourceLoader 加载资源请求的过程中请求完成加载错误时。
它不应该在 AVPlayer 上进行手动播放停止,以避免处理手动停止和 KVO/通知之间的竞争条件
避免发生错误时在 AVPlayer 上手动停止播放以避免竞争条件。
尝试返回回调“resourceLoader:shouldWaitForLoadingOfRequestedResource:”的部分以返回 NO 它不会使 AVPlayer 将状态更改为失败,也不会发送有关播放器失败的通知
在调用 AVAssetResourceLoadingRequest.finishLoadingWithError() 时预期 AVPlayer 将发送失败通知或 KVO 状态更改
实际 AVPlayer 没有状态变化也没有失败通知
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 加载?
谢谢