加载 AVPlayer 时出现错误线程 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
Posted
技术标签:
【中文标题】加载 AVPlayer 时出现错误线程 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)【英文标题】:Getting error Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT) when loading AVPlayer 【发布时间】:2017-09-04 18:01:37 【问题描述】:当我选择 collectionViewCell 时,我正在尝试加载 AVPlayer,这是我在 didSelectItem
中的代码:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
if let item = items?[indexPath.item]
showPlayer(item: item)
func showPlayer(item: Item)
let playerLauncher = PlayerLauncher()
playerLauncher.showVideoPlayer()
let playerView = PlayerView()
playerView.item = item
playerView.setupPlayerView()
这是我的 PlayerLauncher 文件:
class PlayerView: UIView
var item: Item?
didSet
if let id = item?.itemId
itemId = id
var itemId = String()
override init(frame: CGRect)
super.init(frame: frame)
backgroundColor = UIColor(white: 0.3, alpha: 1)
var player: AVPlayer?
func setupPlayerView()
let baseurl = "http://xample.com/play.m3u?id="
let urlString = "\(baseurl)\(itemId)"
print(urlString)
if let url = URL(string: urlString)
player = AVPlayer(url: url)
let playerLayer = AVPlayerLayer(player: player)
self.layer.addSublayer(playerLayer)
playerLayer.frame = self.frame
let audiosession = AVAudioSession.sharedInstance()
do
try audioSession.setCategory(AVAudioSessionCategoryPlayback)
catch let err
print(err)
return
player?.play()
player?.addObserver(self, forKeyPath: "currentItem.status", options: .new, context: nil)
class PlayerLauncher: NSObject
func showVideoPlayer()
print("Showing the player...")
if let keyWindow = UIApplication.shared.keyWindow
let view = UIView(frame: keyWindow.frame)
view.backgroundColor = UIColor.white
view.frame = CGRect(x: keyWindow.frame.width - 10, y: keyWindow.frame.height - 10, width: 10, height: 10)
let playerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.height)
let playerView = PlayerView(frame: playerFrame)
view.addSubview(playerView)
keyWindow.addSubview(view)
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations:
view.frame = keyWindow.frame
, completion: (completedAnimation) in
//later...
)
所以每当我选择项目时,播放器开始加载,控制台打印 URL(因为我在那里添加了打印语句),这就是它打印的内容:
http://xample.com/play.m3u?id=12345
(lldb)
然后它崩溃并在 AppDelegate 中显示 Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
错误。我该如何解决?
谢谢。
更新:
我稍微更改了didSelectItem
函数。代码如下:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
if let item = items?[indexPath.item]
showPlayer(item: item)
func showPlayer(item: Item)
let playerLauncher = PlayerLauncher()
playerLauncher.showPlayer(item: item)
我将PlayerView
中的init
方法改成这样:
var item: Item?
didSet
if let id = item?.itemId
itemId = id
init(frame: CGRect, item: Item)
super.init(frame: frame)
self.item = item
setupPlayerView()
setupContainerView()
backgroundColor = UIColor(white: 0.3, alpha: 1)
以及PlayerLauncher
中所需的更改:
let playerView = PlayerView(frame: playerFrame, item: item)
view.addSubview(playerView)
我在let playerView
行上放了一个断点,我可以看到那里传递的项目 ID。但它没有被传递给 PlayerView
类中的 urlString。因此,ID 仍然是" "
。
【问题讨论】:
兄弟,你还是犯了同样的错误。我不知道如何让你明白这一点……但我会再试一次。 【参考方案1】:我制作了一份指南,希望能说明您一直误解的内容。
我向其他读者道歉,因为我没有使用 MARKDOWN 文本格式,但请将此视为我对原始海报的最大尝试。我们已经在上一篇文章中进行了充分的讨论。
那么,你如何解决这个问题? 直接给你代码估计没什么好用的,请尝试根据这些信息修复代码。
如果您还有其他问题,我会尽力帮助您:)
【讨论】:
嘿!我终于修好了!谢谢你的帮助! :D【参考方案2】:看来
class PlayerLauncher: NSObject
没有办法参考
let playerView = PlayerView()
尝试在函数范围之外定义它们,以便它们可以被函数更改并在函数外部引用。
【讨论】:
我删除了setupPlayer()
func 并在override init
中编写了AVPlayer 代码。它现在没有崩溃,但 itemId
现在是空的,它什么也不播放。
只需创建另一个变量,在初始化之后/期间传递给任何需要它的变量以上是关于加载 AVPlayer 时出现错误线程 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)的主要内容,如果未能解决你的问题,请参考以下文章
在 WebRTC 库中关闭视图控制器时出现 EXC_BAD_ACCESS 错误时崩溃
Swift 线程 1:当我尝试更改 uilabel.text 时出现 EXC_BAD_INSTRUCTION