AVPlayer 在 CI 服务器上的单元测试期间无法加载文件

Dan*_*day 3 continuous-integration ios avplayer

我有一些单元测试会导致AVPlayer加载本地文件。文件很小 (~2KB)m4a该文件是测试包中的这些测试对我来说都是本地工作。

\n\n

当在 Travis 上设置我的项目时,我注意到导致AVPlayer在 Travis 上设置我的项目时,我注意到导致加载文件失败的我尝试了其他几个 CI 服务,也遇到了同样的问题。我增加了测试超时但没有运气。所有其他测试均通过。

\n\n

我加载如下文件(简化):

\n\n
let path = Bundle(for: type(of: self)).path(forResource: "Pop", ofType: "m4a")!\nlet url = URL(fileURLWithPath: url)\n\nself.player.replaceCurrentItem(with: AVPlayerItem(url: url))\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的代码观察到AVPlayer.currentItem.status。当在 CI 上运行时,观察者会以状态触发.failed。是player.errornil并且player.currentItem.error是:

\n\n
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSUnderlyingError=0x7f86e1cd8070 {Error Domain=NSOSStatusErrorDomain Code=-101 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-101), NSLocalizedDescription=The operation could not be completed}\n
Run Code Online (Sandbox Code Playgroud)\n\n

有趣的是,在另一个测试中,我故意尝试加载损坏的文件(以断言它无法播放并且我的代码返回相关错误),我收到以下错误,这是预期的,并表明存在 \xe2\x80\x99s从文件系统读取没有问题:

\n\n
Error Domain=AVFoundationErrorDomain Code=-11829 "Cannot Open" UserInfo={NSUnderlyingError=0x7f86e1cd7ba0 {Error Domain=NSOSStatusErrorDomain Code=-12848 "(null)"}, NSLocalizedFailureReason=This media may be damaged., NSLocalizedDescription=Cannot Open}\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新

\n\n

我\xe2\x80\x99已经看到,在本地测试我偶尔(也许一天一次\xe2\x80\x99工作)会遇到类似的失败。似乎是当我重新打开 Xcode 和项目时,此后就可以工作了。也许有些东西AVFoundation需要一段时间才能初始化?我很想能够模拟AVPlayer,也许我\xe2\x80\x99会为此添加一个协议并且AVPlayerItem......

\n

小智 5

我有完全相同的问题和相同的错误。我最初尝试了视频和音频文件,但没有成功。然后,我解决了创建没有音频的视频的问题。我怀疑这个问题是由 Travis-CI 的虚拟机没有声卡导致操作系统错过一些能够重现文件的东西引起的。

不过,我不能 100% 确定是否是缺少音频或视频导出方式解决了问题。

视频测试.mp4

  • 我的最终结论是“AVFoundation”播放根本无法在(可能)没有音频硬件的 CI 上运行。这本身是可以理解的,但令人沮丧的是,该 API 不是基于协议的,而且在 Swift 中模拟起来很痛苦。我最终使用以下开关关闭了音频测试:`-skip-testing:MyTests/AudioEngineSpec`。 (2认同)