使用 AVPLayer 实现媒体播放器以在 Swift 4 的模态视图控制器的弹出视图中播放来自远程 url 的音频

Posted

技术标签:

【中文标题】使用 AVPLayer 实现媒体播放器以在 Swift 4 的模态视图控制器的弹出视图中播放来自远程 url 的音频【英文标题】:Implementing media player using AVPLayer to play audio from remote url in popup view in modal view controller in Swift 4 【发布时间】:2018-09-05 12:41:01 【问题描述】:

抱歉,我的标题太长了,因为我试图完成很多事情,试图在模态视图控制器中使用 AVPlayer 从 url 播放音频文件。我使用了 Apple 的基础示例 - AVFoundationSimplePlayer,对其进行了调整并添加了一些东西。播放器工作正常,但我几乎没有要解决的挑战,如下所述:

这里是完整的源代码Source Code of my project

1) 参考下面的截图,我希望modal vc的背景是透明的,这样我就可以看到启动这个modal view的view。

2) 在加载模态 vc 之后以及在弹出视图出现并突出显示控件之前存在延迟。不知道延迟正常吗?如果这是正常的并且我们对此无能为力,那么我想在此加载期间添加活动控制。我不确定何时停止此活动控制。

3) 在播放器加载控件之前显示错误。不确定它们是什么?

2018-09-05 13:32:56.519014+0100 AVFoundationSimplePlayer-Swift[44042:2403222] 任务 . 以错误结束 - 代码: -999 2018-09-05 13:32:57.607560+0100 AVFoundationSimplePlayer-Swift[44042:2403221] 任务 . 以错误结束 - 代码: -999

【问题讨论】:

【参考方案1】:

我刚刚检查了您随附的示例代码。在将任何AVPlayerItem 分配给player 之前,您正在使用play 函数。您正在异步加载asset,在下载asset 之前player 无法播放。那你应该怎么做

asset = AVURLAsset(url: movieURL, options: nil)

/// Just after making an asset and remove the code written in asset's setter
let item = AVPlayerItem(asset: asset!)
player = AVPlayer(playerItem: item)

/// This extra line is to playing the live url. It will play what it downloads in chunks.
if #available(ios 10.0, *) 
    player.automaticallyWaitsToMinimizeStalling = false
 else 
    // Fallback on earlier versions


/// Now your player is ready to play
player.play()

编辑 1 如果您仍然在上面的代码中苦苦挣扎,那么我已经在 PlayerViewController.m 文件中进行了更改以解决您的问题。这是该文件的gist link。搜索 /// TheTiger Change 以查找我所做的更改。现在我可以播放具有适当时间和滑块值的音频文件了。

编辑 2 我以为你会看到差异,但没问题我会更详细地解释。

#3. 关于您的错误消息,这只是 Xcode 调试消息,您可以禁用它。详情请参阅this answer。

#2. 显示模式存在延迟,因为您在 viewWillAppear: 方法中拥有所有代码,只需将该代码移动到 videDidAppear: 并让视图首先出现,然后再执行任何操作.它将消除延迟。

#1. 模态vc的背景要透明。所以可以让它透明见this answer。

这个Sample Code 工作正常。

【讨论】:

感谢您查看代码。对不起,我不是专家编码器,我还在学习。我对 Apple 的示例代码本身有点不知所措,所以不确定哪段代码在哪里。如果您在修改过的文件中有它,那么您可以在此处复制并粘贴它吗?发送 实际上我已经离开了这一天并通过移动应用程序在线......但是现在'asset = AVURLAsset(url:movieURL,options:nil)'在您的项目中搜索这一行并添加代码在这里。首先尝试简单的播放器,因为您不需要那么多代码来实现此目的。您已经创建了资产.. 制作一个 playerItem 并将其传递给 AVPlayer 并播放。 是的,我试过了,没用。它没有加载。可能是我做错了什么。另一件事是您的解决方案将解决我的哪个问题? PL。参考我上面提到的3个问题。 第三个问题,也有错误和弹出延迟。并尝试将其作为单独的问题,因为它太宽泛,任何人都无法同时回答所有三个问题。 感谢您花时间和精力研究代码。我复制并粘贴了您的整个代码,但加载和播放仍然出现延迟,并且错误仍然存​​在。

以上是关于使用 AVPLayer 实现媒体播放器以在 Swift 4 的模态视图控制器的弹出视图中播放来自远程 url 的音频的主要内容,如果未能解决你的问题,请参考以下文章

AVPlayer自定制视频播放器——耳机线控中断以及AVAudioSession的使用

AVPlayer 层不适合播放器视图

如何从 mediaPickerController 获取 mediaItemCollection 以在 AVPlayer 上播放?

AVPlayer的使用+简单的播放器Demo

如何正确删除/释放 AVPlayer/AVPlayerItem?

ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调