问题标签 [avurlasset]
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.
avfoundation - 视频播放器的这个 AVFoundation KVO 模式有什么问题 [ref: AVPlayerLayer, AVPlayerItem, AVURLAsset]?
我写了一个 UIView 子类“VideoPlayerView”来封装 AVFoundation 视频播放。我相信我设置了一个防弹的 KVO 模式来处理对 AVPlayer、AVPlayerItems 和 AVURLAssets 的观察,以达到加载、播放和错误处理的目的。
相反,我发现报告的崩溃是专门为防止这种模式而设置的(很少,但仍然报告)。
a) AVPlayerItem 类的实例 0x170019730 被释放,而键值观察者仍向其注册。
b) [VideoPlayerView setPlayerItem:] 无法从 AVPlayerItem 中移除关键路径“status”的观察者 VideoPlayerView,因为它没有注册为观察者。
c) [VideoPlayerView setAsset:] 无法从 AVURLAsset 0x170233780 中删除关键路径“可播放”的观察者 VideoPlayerView 0x145e3bbd0,因为它没有注册为观察者。
我想了解为什么会发生这些错误,我错过或误解了什么,以及如何使事情变得更健壮。
为了解释的目的,对具体细节进行了简化,但我相信所有相关信息都在这里。
我有一个类 VideoPlayerView,它包含以下属性:
请注意,所有引用都是强引用 - 在 VideoPlayerView(正在执行观察)本身被释放之前,这些对象不能被释放。 AVPlayerLayer 保持对其 AVPlayer 属性的强引用。
我实现自定义getter如下:
我实现自定义设置器如下:
在这些自定义设置器之外,VideoPlayerView 始终使用“self.property =”或“[self setProperty:]”,而从不使用“_property =”,因此始终使用自定义设置器。
最后,VideoPlayerView 实现了一个 dealloc 方法,如下所示:
是的,我应该内联这个毫无意义的抽象!尽管如此,这意味着在解除分配 VideoPlayerView 时,其中的任何强属性都会删除其观察结果,然后将其释放以允许解除分配。
那么,我相信这种模式应该可以减轻我观察到的崩溃,如下所示:
a) AVPlayerItem 类的实例 0x170019730 被释放,而键值观察者仍向其注册。
VideoPlayerView 是我唯一观察 AVPlayerItem 的类。VideoPlayerView 在观察它的同时保持对 AVPlayerItem 的强引用。因此,当 VideoPlayerView 处于活动状态时,无法释放 AVPlayerItem,并且在其释放之前,VideoPlayerView 将在 AVPlayerItem 的后续释放之前停止观察 AVPlayerItem。
这是怎么回事?
b) [VideoPlayerView setPlayerItem:] 无法从 AVPlayerItem 中移除关键路径“status”的观察者 VideoPlayerView,因为它没有注册为观察者。
c) [VideoPlayerView setAsset:] 无法从 AVURLAsset 0x170233780 中删除关键路径“可播放”的观察者 VideoPlayerView 0x145e3bbd0,因为它没有注册为观察者。
我的自定义设置器试图在用指向新的或传入的 AVPlayerItem 或 AVURLAsset 的指针替换属性之前删除对任何先前设置的 AVPlayerItem 或 AVURLAsset 的观察。
当我的类被实例化时,_playerItem 和 _asset 为零。因此,任何以前的 AVPlayerItem 或 AVURLAsset 都必须通过自定义设置器进行设置,因此将 VideoPlayerView 注册为这些键路径的观察者。
在没有设置观察的情况下如何设置这些属性?
这些只是基于自定义设置器中方法调用顺序的可怕竞争条件吗?
我在这里缺少一些基本的东西吗?
我正在考虑使用objective-c运行时在这些对象上创建一个关联的对象属性BOOL isObserved,以便能够在尝试删除观察者之前进行完整性检查。考虑到当前方法的问题,我觉得即使这也不够稳健。
非常感谢任何见解或帮助。感谢您的阅读。
objective-c - (IOS 10) RequestAVAssetForVideo 结果资产 = nil
RequestAVAssetForVideo 结果一直为零:
- iOS 10(仅限)(iOS 11 运行良好)
- 当前 iPhone 上未录制的视频
- 存储在照片库中的视频
- 请求的localIdentifier = 1BF03030-1CB7-49ED-9314-D0B8D1C34D72/L0/001
资产Url = nil
PHAsset* 资产 = [PHAsset fetchAssetsWithLocalIdentifiers:@[file.localIdentifier] options:nil].firstObject;
ios - 响应没有“Content-Lenght”标头时的 AVURLAsset
我的 iOS 应用程序使用 AVPlayer 从我的服务器播放流式音频并将其存储在设备上。我实现了 AVAssetResourceLoaderDelegate,所以我可以拦截流。我更改了我的方案(从http
一个假方案,以便调用 AVAssetResourceLoaderDelegate 方法:
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool
我遵循了本教程:
http://blog.jaredsinclair.com/post/149892449150/implementing-avassetresourceloaderdelegate-a
在那里,我把原来的方案放回去,并创建一个从服务器提取音频的会话。Content-Length
当我的服务器为流式音频文件提供(音频文件的大小,以字节为单位)标头时,一切正常。
但有时我会在无法提前提供其长度的情况下流式传输音频文件(比如直播播客流)。在这种情况下, AVURLAsset 将长度设置为-1
并失败:
"Error Domain=AVFoundationErrorDomain Code=-11849 \"Operation Stopped\" UserInfo={NSUnderlyingError=0x61800004abc0 {Error Domain=NSOSStatusErrorDomain Code=-12873 \"(null)\"}, NSLocalizedFailureReason=This media may be damaged., NSLocalizedDescription=Operation Stopped}"
我无法绕过这个错误。我尝试了一种骇人听闻的方式,提供 fake
Content-Length: 999999999
,但在这种情况下,一旦下载了整个音频流,我的会话就会失败:
Loaded so far: 10349852 out of 99999999
The request timed out.
//Audio file got downloaded, its size is 10349852
//AVPlayer tries to get the next chunk and then fails with request times out
有没有人遇到过这个问题?
PS 如果我http
在 AVURLAsset 中保留原始方案,AVPlayer 知道如何处理这个方案,所以它可以很好地播放音频文件(即使Content-Length
没有),我不知道它是如何做到的,没有失败。此外,在这种情况下,我的 AVAssetResourceLoaderDelegate 从未使用过,因此我无法截取音频文件的内容并将其复制到本地存储。
这是实现:
ios - 读取 HLS 播放列表信息以动态更改 Item 的 preferredBitRate
我正在开发一个视频应用程序,我们正在将常规 mp4 文件更改为 HLS,我们必须进行更改的众多原因之一是我们对视频的带宽使用有了更多的控制(我们加载了很多其他的东西在我们的播放器中,因此我们需要以最佳方式优化体验)。
因此,AVFoundation
在 iOS10 中引入了使用以下方式控制带宽的能力:
iOS11上也引入了一个配置,用 来设置item的最大分辨率preferredMaximumResolution
,所以我们正在使用它,但是我们仍然需要一个针对iOS10设备的解决方案。
好吧,现在我们可以控制了,preferredPeakBitRate
这很好,但是我们有一个问题,并非所有 HLS 源都是由我们生成的,所以假设我们要在未连接到 wifi 网络时设置最大分辨率为 480p ,今天我没有办法实现这一点,我并不总是能够知道所选的 480p 源需要多少带宽HLS playlist
。
我正在考虑的一件事是阅读m3u8
文件中的信息,至少知道我的播放器可以显示哪些不同质量的来源以及每个人需要多少带宽。
一种方法是,将m3u8
播放列表作为纯文本下载,使用正则表达式读取文件并处理这些数据,好吧,我试图避免这种情况,我认为这应该不那么困难。
我无法从曲目中读取此信息,因为 a) 我找不到信息,b) 更改质量时动态替换曲目,是的,每个质量级别都有 1 个曲目。
所以,我不知道我怎么能得到这个信息,我搜索了谷歌,stackoverflow,我找不到这个信息,有人可以帮助我吗?
这是我想做的一个例子,我有这个示例播放列表:
我只想在我的代码中的数组上提供这些信息,如下所示:
并打印如下内容:
ios11 - 应用关闭时离线 HLS Fairplay 播放错误,代码 16227
在使用 AVContentSessionKey 的 FairPlay Streaming Server SDK v4.0.1 中的演示之后,我正在使用 HLS Fairplay 实现离线播放。我下载了三个内容,每个内容都正确下载并保存,文件目录上的.movpkg及其内容键,当我关闭WIFI时,这三个下载的内容可以正常播放,没有任何问题,在播放之前我使用这个代码:
到目前为止,一切都很好。但问题是当我关闭应用程序(主页按钮关闭应用程序)然后播放下载的内容时,只有最后下载的内容正确播放,其他内容(第一个和第二个)在控制台上发送这些错误。
我用文档目录中的键仔细检查 .movpkg 并正确显示
在错误发生之前,调用 ContentKeyDelegate 并正确加载密钥并将其传递给请求。
如果persistableContentKeyExistsOnDisk(withContentKeyIdentifier:assetIDString){
如果我打印 contentKeyRecipients 三个内容正确显示
我的测试在 iOS 11.1.2 和 iOS 11.2 beta 2 中
我不确定发生了什么,但似乎是持久密钥的问题,我不知道是否每个内容都需要与一个 AVContentKeySession 相关联。
如果有人遇到类似的问题,任何帮助将不胜感激。
提前致谢
swift - 如何在 Swift 中从 AVAsset 获取视频时长
这可能是重复的问题,但我花了很多时间来解决问题。我将一个 mp4 文件下载到文档目录。我可以使用此功能获取所有文件名:
我想得到所有这些文件的时间长度。让我展示一下我的尝试:
输出是
在我看来,当我尝试获取视频文件的 url 时我做错了。但是如何解决这个问题。我尝试了很多东西。即使我检查文件是否存在。它当然存在。
我也尝试
不幸的是它不起作用..
objective-c - AVURLAsset (MP3) 不显示音轨
我正在尝试将 mp3 设置为视频的音轨。但是,我在 AVURLAsset 中找不到任何曲目。这个 mp3 在我的项目中,所以它是一个本地文件。
我的代码在下面,我也尝试过获取任何曲目,但也超出了范围。
我错过了什么?我对视频文件执行相同类型的程序,没有问题。任何帮助将不胜感激!
更新
经过一番研究,我发现曲目可能尚未加载,我可以请求加载它们。我尝试了相同的结果:(
我还尝试了不同的 MP3 和 WAV 文件,结果也相同!帮助!!!!
ios - 如何从视频中选择质量最好的缩略图
有没有办法从视频中生成高质量的缩略图。我下面的这个函数将视频的第一帧生成为缩略图。问题通常是缩略图像素化,因为它不是来自视频的固定帧。有没有办法生成缩略图,以便它从中选择的帧不模糊,或者是一个高质量的帧?
ios - AVAssetResourceLoaderDelegate 中的错误处理
在 AVAssetResourceLoaderDelegate 中处理错误的推荐方法是什么?shouldWaitForLoadingOfRequestedResource
特别是/中的网络请求shouldWaitForRenewalOfRequestedResource
?
但是,在我开始播放视频之前,我的应用程序无法知道出了什么问题。我在委托呼叫中尝试过loadingRequest.finishLoading(with: err)
,但在下载完成并且用户开始播放视频之前没有报告任何内容。return false
shouldWaitForLoadingOfRequestedResource
代码是这样的..
设置后preloadsEligibleContentKeys = true
,似乎shouldWaitForLoadingOfRequestedResource
在 AVURLAsset 中设置资源加载器委托后立即调用。但是没有办法告诉资源加载器已经成功地获得了它想要的所有信息。
我尝试loadValuesAsynchronously
在 AVURLAsset 上使用,但这也是不行的。
AVAssetDownloadURLSession 也不总是报告错误。
提前致谢。