cocoa-touch - 为什么通过 AV Foundation 播放音频会在慢速连接时阻塞 UI?

标签 cocoa-touch ios networking nstimer avfoundation

我正在使用 AV Foundation 播放通过网络加载的 MP3 文件,其代码与此处的播放示例几乎相同:Putting it all Together: Playing a Video File Using AVPlayerLayer , 除了没有附加视频播放层。我试图让我的应用程序响应播放缓冲区在慢速网络连接上变空。为此,我计划在 AVPlayerItem 的 playbackBufferEmpty 属性上使用键值观察,但文档没有说明这是否可行。我认为这可能是可能的,因为可以观察到 status 属性(并且是上面的示例),即使文档没有这么说。

因此,为了创造缓冲区清空的条件,我在服务器上添加了代码,以便在处理完 MP3 文件的每个 8k block 后休眠两秒钟。令我惊讶的是,这导致我的应用程序的 UI(使用 NSTimer 更新)长时间完全卡住,尽管它在分析器中显示几乎没有 CPU 使用率。我尝试使用 dispatch_async 将轨道加载到另一个队列,但这根本没有帮助。

即使服务器没有休眠,我也注意到使用 AVPlayerItem 加载流会阻止 UI 在流下载的短时间内更新。我不明白为什么缓慢的文件下载会阻止 UI 的响应能力。知道为什么会这样或者我能做些什么吗?

最佳答案

好的,问题解决了。看起来将选项中的 AVURLAssetPreferPreciseDurationAndTimingKey 传递给 URLAssetWithURL:options: 会导致速度变慢。这也仅在从 NSTimer 触发的选择器访问 AVURLAsset 的持续时间属性或与流的时间相关的其他一些属性时发生。因此,如果您可以避免轮询时间信息,这个问题可能不会影响您,但那不是我的选择。如果不要求精确计时,仍然会有0.75秒到1秒左右的延迟,但仅此而已。

回过头来看,文档确实警告说精确计时可能会导致性能下降,但我从没想过会有 10 秒以上的延迟。为什么延迟会随着媒体的加载时间而增加,这超出了我的理解范围;似乎它应该只随文件的大小缩放。也许 iOS 正在对新数据进行某种繁重的轮询和/或一遍又一遍地处理相同的字节。

所以现在,如果没有“精确的时间和持续时间”, Assets 的持续时间将永久为 0.0,即使它已满载也是如此。我也可以回答我最初的目标是在 AVPlayerItem.isPlaybackBufferEmpty 上做 KVO。无论如何,KVO 似乎都是无用的,因为该属性一开始是 NO,一旦我开始播放就更改为 YES,并且即使媒体一次播放几分钟也仍然是 YES。文档是这样描述属性的:

Indicates whether playback has consumed all buffered media and that playback will stall or end.

所以我猜这不准确,至少在这种特殊情况下,该属性不是很有用。

关于cocoa-touch - 为什么通过 AV Foundation 播放音频会在慢速连接时阻塞 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942848/

相关文章:

python - Scapy 数据包嗅探器触发对每个嗅探数据包的操作

iphone - 这些位掩码实际上是如何工作的?

ios - 在 Swift 的 Controller 中传输值的问题

ios - XC测试 : Can not get the last collection cell element after swipeLeft()

java - 自动刷新Java中连接的IP地址列表

android - 在 Android 上检测网络连接类型

iphone - 有没有办法在 UIImage 中制作超越图像堆栈的动画?

ios - 是否有任何原因导致我的 UITableViewCell 重写 setHighlighted 不会被调用但 UITableViewDelegate 方法会被调用?

iphone - 防止 sqlite 转义反斜杠

ios - 对包含 NSString 对象的 NSMutableArray 进行排序