加载 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)的主要内容,如果未能解决你的问题,请参考以下文章

按下按钮时出现错误 EXC_BAD_ACCESS

在 WebRTC 库中关闭视图控制器时出现 EXC_BAD_ACCESS 错误时崩溃

Swift 线程 1:当我尝试更改 uilabel.text 时出现 EXC_BAD_INSTRUCTION

带有 AVPlayer 的音频流

尝试更改 Bool 属性时出现 EXC_BAD_ACCESS 错误

滚动 UITableView 时出现 EXC_BAD_ACCESS 错误