标签: avassetdownloadtask

dyld 未找到 AVAssetDownladTask

尝试将离线 HLS(ios 10 的一项新功能)添加到应用程序。我正在快速尝试以下操作,以便应用程序在没有离线 HLS 功能的情况下仍能在 ios 9 上运行。在 ios10 上运行良好,也可以为 ios9 编译。

    @available(iOS 10.0, *)
    @objc class DownloadManager: NSObject, AVAssetDownloadDelegate {
           //Do stuff with downloading assets
      }
Run Code Online (Sandbox Code Playgroud)

但是,当我在 ios 9 设备上实际运行它时,应用程序立即崩溃并显示以下消息:

dyld:未找到符号:_OBJC_CLASS_$_AVAssetDownloadTask 引用自:/var/mobile/Containers/Bundle/Application/7062C410-C4F5-4270-9F1E-22750E99F799/wod.app/wod 预期在:/Systemworks/FoundaryFrame /var/mobile/Containers/Bundle/Application/7062C410-C4F5-4270-9F1E-22750E99F799/wod.app/wod中的框架/AVFoundation

我已将与此相关的所有代码都限制在 DownloadManager 类中,所以我不知道下一步该做什么。谢谢!

http-live-streaming ios swift ios10 avassetdownloadtask

12
推荐指数
2
解决办法
2446
查看次数

下载前获取 AVAssetDownloadTask 的大小

我目前正在使用 FairPlay 流实现离线流。因此,我正在使用AVAssetDownloadTask.

我想向用户提供有关开始下载的大小的反馈:

您确定要下载此流吗?下载需要 2.4GB,您目前还有 14GB 的空间

我已经检查过类似countOfBytesReceived和的属性,countOfBytesExpectedToReceive但这些不会返回正确的值。

let headRequest = NSMutableURLRequest(URL: asset.streamURL)
headRequest.HTTPMethod = "HEAD"
let sizeTask = NSURLSession.sharedSession().dataTaskWithRequest(headRequest) { (data, response, error) in
    print("Expected size is \(response?.expectedContentLength)")
}.resume()
Run Code Online (Sandbox Code Playgroud)

打印大小为 2464,最后大小为 3GB。

在下载过程中,我记录了上述属性:

func URLSession(session: NSURLSession, assetDownloadTask: AVAssetDownloadTask, didLoadTimeRange timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange) {
    print("Downloaded \( convertFileSizeToMegabyte(Float(assetDownloadTask.countOfBytesReceived)))/\(convertFileSizeToMegabyte(Float(assetDownloadTask.countOfBytesExpectedToReceive))) MB")
}
Run Code Online (Sandbox Code Playgroud)

但这些保持为零:

已下载 0.0/0.0 MB

fairplay nsurlsession nsurlsessiondatatask avassetdownloadtask

7
推荐指数
1
解决办法
1421
查看次数

如何防止 iOS 自动删除为离线播放而保存的 HLS 内容?

HLS 离线播放是在WWDC 2016 的这次会议上在 iOS 10 中宣布的。但在 21:20 左右,演示者正在谈论如何将下载的文件从放置位置移动AVAssetDownloadTask,因为系统可能需要如果磁盘空间不足,则删除它们。文档中提到了这种可能性:

重要的

如果可用磁盘空间极低,操作系统可能会自动删除下载的资源。在向用户展示资产可供播放之前,请验证该资产是否存在并且可以离线播放。

我正在构建一个应用程序来使用 HLS 播放受 DRM 保护的音频内容,并且我希望支持流式传输和下载,以便用户可以保存他们想要的文件以供离线播放。但如果下载的文件在未经用户许可的情况下被删除,那就是一种糟糕的体验。

所以我的问题是:如何防止系统删除下载的文件?即使文档明确表示不可以,我可以移动它们吗?有其他方法可以下载文件吗?iOS 11 中有一个新类,AVAssetDownloadStorageManager支持将存储管理策略设置为默认或重要...是否有任何保证系统不会在至少先询问用户的情况下删除“重要”下载的媒体?Roger Pantos 在WWDC 2017 的 HTTP Live Streaming 进展中表示,系统可能会在询问用户后删除资产,以便为软件更新腾出空间,但这并不意味着资产不会因其他原因而自动删除。

http-live-streaming ios avassetdownloadtask avassetdownloadstoragemanager

6
推荐指数
1
解决办法
628
查看次数

下载和播放离线HLS内容-iOS 10

从iOS 10开始,Apple提供了下载HLS(m3u8)视频以供离线查看的支持。

我的问题是:是否只有在播放HLS时才可以下载?或者我们可以在用户按下下载按钮并显示进度时下载。

是否有人在Objective C版本中实现了此功能?实际上,我以前的应用程序是在Objective C中制作的。现在,我想增加对下载HLS而不是MP4的支持(以前我是为了离线查看而下载MP4的)。

我真的很绝望。请分享想法或任何实施的代码。

http-live-streaming ios avplayer m3u8 avassetdownloadtask

5
推荐指数
2
解决办法
3616
查看次数

是什么导致 AVAssetCache 报告完全下载的资产无法离线播放?

我正在开发一个 iOS 应用程序,它通过 HLS 播放 FairPlay 加密的音频,并支持下载和流式传输。在飞行模式下,我无法播放下载的内容。如果我AVURLAsset在下载完成时从本地 URL创建一个,asset.assetCache.isPlayableOffline返回NO,并且当我尝试以飞行模式播放时,它仍然尝试请求 .m3u8 播放列表文件之一。

我的主播放列表如下所示:

#EXTM3U
# Created with Bento4 mp4-hls.py version 1.1.0r623

#EXT-X-VERSION:5
#EXT-X-SESSION-KEY:METHOD=SAMPLE-AES,URI="skd://url/to/key?KID=foobar",KEYFORMAT="com.apple.streamingkeydelivery",KEYFORMATVERSIONS="1"


# Media Playlists
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=133781,BANDWIDTH=134685,CODECS="mp4a.40.2" media-1/stream.m3u8
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=67526,BANDWIDTH=67854,CODECS="mp4a.40.2" media-2/stream.m3u8
Run Code Online (Sandbox Code Playgroud)

流播放列表如下所示:

#EXTM3U
#EXT-X-VERSION:5
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:30
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="skd://url/to/key?KID=foobar",KEYFORMAT="com.apple.streamingkeydelivery",KEYFORMATVERSIONS="1"
#EXTINF:30.000181,
#EXT-X-BYTERANGE:470290@0
media.aac
# more segments...
#EXT-X-ENDLIST
Run Code Online (Sandbox Code Playgroud)

下载资产:

AVURLAsset *asset = [AVURLAsset assetWithURL:myM3u8Url];
[asset.resourceLoader setDelegate:[FairPlayKeyManager instance] queue:[FairPlayKeyManager queue]];
asset.resourceLoader.preloadsEligibleContentKeys = YES;
AVAssetDownloadTask *task = [self.session assetDownloadTaskWithURLAsset:asset assetTitle:@"Track" assetArtworkData:imgData options:nil];
[task resume];
Run Code Online (Sandbox Code Playgroud)

在代表的URLSession:assetDownloadTask:didFinishDownloadingToURL:

self.downloadedPath = location.relativePath;
Run Code Online (Sandbox Code Playgroud)

在代表的URLSession:task:didCompleteWithError: …

avfoundation fairplay http-live-streaming avasset avassetdownloadtask

5
推荐指数
1
解决办法
1511
查看次数

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

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

错误域=AVFoundationErrorDomain代码=-11863“操作已停止”UserInfo={NSLocalizedFailureReason=此内容不再可用。,NSLocalizedDescription=操作已停止}

我的流程是:

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

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

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

但这看起来很可怕。这不可能是真的。

所以,我的问题是:如何下载 FairPlay 加密的 AVURLAsset,而不需要之前流式传输该特定实例?

ios avassetdownloadtask avassetresourceloaderdelegate

5
推荐指数
1
解决办法
1565
查看次数

使用 AVAssetDownloadTask 播放时缓存 HLS 视频

我正在尝试在播放 HLS 流时缓存它。我正在关注有关此的 Apple 文档(播放离线资源部分):

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/HTTPLiveStreaming/HTTPLiveStreaming.html#//apple_ref/doc/uid/TP40016757-CH11-SW1

我已经实现了以下方法 - 这应该使我的 HLS 流在播放时下载:

func downloadAndPlayAsset(_ asset: AVURLAsset) {
    // Create new AVAssetDownloadTask for the desired asset
    // Passing a nil options value indicates the highest available bitrate should be downloaded
    let downloadTask = downloadSession.makeAssetDownloadTask(asset: asset,
                                                             assetTitle: assetTitle,
                                                             assetArtworkData: nil,
                                                             options: nil)!
    // Start task
    downloadTask.resume()

    // Create standard playback items and begin playback
    let playerItem = AVPlayerItem(asset: downloadTask.urlAsset)
    player = AVPlayer(playerItem: playerItem)
    player.play()
}
Run Code Online (Sandbox Code Playgroud)

问题是它只是不下载视频,只播放流。我还实现了代表,但他们都没有被调用:

func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didLoad …
Run Code Online (Sandbox Code Playgroud)

http-live-streaming ios avplayer swift avassetdownloadtask

5
推荐指数
1
解决办法
1545
查看次数