- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 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/
我开始了一个项目,使用 UIImagePickerController 来捕获静态图像。由于叠加层和刚刚捕获的图像之间的交互不佳,我已经放弃使用这种简单的机制。问题如下:如果您有一个叠加层处于事件状态
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How many styles of writing functions are there in C? 我
最近在看GSM音频编码的源码。这些代码是在 1992 年或之后编写的。 有一些奇怪的代码,例如: main P2((ac, av), int ac, char ** av) void Gsm_Code
使用 https://pypi.org/project/av/试图打开文件进行无限播放。但循环以最后一帧结束。 查找和阅读手册后,测试代码如下: (注意:这些选项预计将传递给 aiortc.contr
随着新病毒变种的发布,搜索字符串形式的数据继续增长,这引发了我的问题 - AV 引擎如何如此有效地搜索文件以查找已知签名?如果我下载了一个新文件,我的 AV 扫描仪会根据其签名迅速识别该文件是否为威胁
在应用程序按预期关闭后大约 3 到 5 秒,我收到此 AV 消息: 00073225 模块 rtl160.bpl 中的异常 EAccessViolation。模块 'rtl160.bpl' 中地址 5
在VCL中,TByteDynArray被定义为动态数组: type TByteDynArray = array of Byte; 但似乎没有完成索引边界检查: var DataBytes: Sys
我有两个引用计数类,它们相互引用实例。其中一个引用被标记为 [weak]防止创建强引用循环。 type TFoo = class(TInterfacedObject) private
我通过资源和图像对话框向我的项目添加图标,并决定放弃TIcon.LoadFromResourceName,因为它不执行任何错误检查。我编写了看似等效的代码,但没有按预期工作。 这是一个对我来说失败的测
我正在尝试使用自定义相机,并将代码从 swift 2 转换为 swift 3;我已经很完整了;但是我收到与设备有关的错误;我想要一个后置和前置摄像头,在 swift 2 之前,您可以像这样设置设备:
我想使用透明重定向(Paypal Payments Pro 软件包的功能)来处理结帐。 PayPal 文档(下面的摘录)说,当使用透明重定向时,PayPal 不会处理检查 AVS 和 CSC,把这个任
音频和视频文件可以使用AV Foundation framework播放和 Media Player framework . 当我只想播放媒体文件时,更好的选择是什么? 借助 Media Player
我将本地视频加载到新的 View Controller 中,但在完成后它会消失并立即再次弹出。我不知道是否有办法跟踪通知或什么。 这是我的代码: import UIKit import AVKit i
您好,我正在使用 AV 框架尝试访问前置摄像头... 这是我这样做的代码.. + (AVCaptureDevice *)camera { NSArray *devices = [AVCaptureD
我正在尝试使用 AVPlayer 在 iOS 上播放视频,该视频是用 zencoder 编码的。我看到的问题是播放器项目报告的持续时间是四舍五入的/不精确的。例如,视频持续时间可能是 173.134,
所以我遇到了旋转问题。我有一个 AV 摄像机设置为在 View Controller 中显示。现在我知道其中涉及很多组件,这就是为什么我只是说 AV 摄像机。我的问题是,当我旋转设备时,预览层也不随设
我的公司正在使用 Stripe API 处理信用卡。 Stripe 提供邮政编码和地址验证系统 (AVS) 检查。 AVS 将用户输入的街道号码与发卡银行的街道号码进行核对。 Stripe 返回三个结
我使用 AVFoundation 来拍照。麻烦的是,即使曝光持续时间、ISO 和白平衡的设置不变,我也会得到不同亮度的照片。手电筒、闪光灯和所有可能的稳定性都被禁用。 此问题也出现在介绍使用相机的标准
我正在尝试诱使 AV Foundation 从内存中的 mp4 文件中读取(不使用中间的写入磁盘解决方案)。我尝试了自己的自定义 URL 协议(protocol)但失败了,因为 AV Foundati
我正在尝试加载视频,在其上添加动画,然后将其导出,但动画永远不会在导出的视频中开始播放。它只是按原样显示图像“dogge_icon.png”。 我尝试了不同类型的动画,不确定我做错了什么。任何帮助将不
我是一名优秀的程序员,十分优秀!