35364


初めて投稿します。swiftでiOSアプリを作成していますが詰まってしまいました。

自作のアルバムに保持している動画ファイルをAVPlayer(AVPlayerViewController)を用いて再生するとsignal
SIGABRTが発生して落ちてしまいます。  
UICollectionViewを用いて、自作アルバムのAssetを表示→cellを選択したものが動画であればAVPlayerで再生するという動作です。  
初めての再生は問題なく動くのですが、再度再生させようとすると落ちます。  
iPhone6では発生せず、iPadでのみ問題発生します。

原因を探っているのですが見つかりません。  
なにか情報等いただけたら幸いです。

[code]

    var avPlayerViewController:AVPlayerViewController = AVPlayerViewController()
    func collectionView(_ collectionView:UICollectionView, didSelectItemAt indexPath:IndexPath)
    {
        let selectAsset = fetchResult.object(at: indexPath.item)
        if selectAsset.mediaType == .video
        {
            phImageManager.requestPlayerItem(forVideo: selectAsset, options: nil, resultHandler: {(playerItem, info) -> Void in
                let playerItem = playerItem
                let player = AVPlayer(playerItem: playerItem)
                self.avPlayerViewController.player = player
                self.avPlayerViewController.delegate = self
                self.present(self.avPlayerViewController, animated:true, completion:{
                    self.avPlayerViewController.player?.play()
                })    // Thread 11: signal SIGABRT発生
            })
        }
    }
    
[/code]


CC BY-SA 3.0
2017-06-01T08:31:28.813
35186
2017-06-07T06:17:15.003
2017-06-01T10:53:44.673
22531
question
ios xcode swift3
自作アルバムの動画をAVPlayerで再生するとsignal SIGABRT発生（iPad）


以下に変更したところ、signal SIGABRTは発生しなくなり落ちなくはなりました。  
※ただし、繰り返しcellの選択→再生→Doneで一覧に戻ると、２回目以降の再生でコントローラーのseekbarと再生時間がおかしくなってしまいます。（前の時間情報が残ったまま？）

[code]

    var avplayerViewController:AVPlayerViewController = AVPlayerViewController()
    func collectionView(_ collectionView:UICollectionView, didSelectItemAt indexPath:IndexPath)
    {
        let selectAsset = fetchResult.object(at: indexPath.item)
        if selectAsset.mediaType == .video
        {
            let player:AVPlayer = AVPlayer()    // requestPlayerItemから外に出しました
            phImageManager.requestPlayerItem(forVideo: selectAsset, options: nil, resultHandler: {(playerItem, info) -> Void in
    // 取得したplayerItemをそのまま使用するように変更（変更前）
    //        let playerItem = playerItem
    //        let player = AVPlayer(playerItem: playerItem)
    // playerのcurrent itemとしてplayerItemを置き換え（変更後）
                player.replaceCurrentItem(with: playerItem)
                self.avPlayerViewController.player = player
    
    //        self.avPlayerViewController.delegate = self    ←特に理由は無いが削除
    
    // presentのcompletionを使用しないように変更（変更前）
    //        self.present(self.avPlayerViewController, animated:true, completion:{
    //            self.avPlayerViewController.player?.play()
    //        })    // Thread 11: signal SIGABRT発生
            })
    // completionをnilへ変更、requestPlayerItemから外に出しました（変更後）
            self.present(self.avPlayerViewController, animated: true, completion: nil)
            player.play()
        }
    
[/code]

落ちなくなった代わりに、再生時間やシークバーの不具合、一時停止ボタンが表示しなくなるなど他の問題があります。UICollectionViewや別画面でナビゲーションコントローラーを使用しているので、どこが要因なのか判別し難いです。


CC BY-SA 3.0
2017-06-05T07:08:26.987
35297
2017-06-05T07:14:30.937
2017-06-05T07:14:30.937
35186
answer


自己解決しました。  
UICollectionViewを持つ画面①(親クラス：UIViewController)とは別クラスの画面②(親クラス：UIViewController)を生成、画面②でAVPlayerViewControllerを持つように変更しました。  
※AVPlayerViewControllerを継承したクラス生成が禁じられているようなのでUIViewControllerで対応  
再生時間やコントローラー、シークバーなどの不具合が起きなくなりました。  
今のところ落ちたりもしていません。  
画面①：ViewControllerOne  
画面②：ViewControllerTwo

画面①（一部） ViewControllerOneクラス

[code]

    var avPlayerViewController:ViewControllerTwo = ViewControllerTwo()
    
    (省略)
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
    {
        let selectAsset = fetchResult.object(at: indexPath.item)
        // 動画のときの処理
        phImageManager.requestPlayerItem(forVideo: selectAsset, options: nil, requestHandler:{(playerItem, info) -> Void in
            self.avPlayerController.initItem(item: playerItem!)
            self.present(self.avPlayerController, animated:true, completion:nil)
        })
    }
    
[/code]

画面②（一部） ViewControllerTwoクラス

[code]

    var avPlayerController: AVPlayerViewController?
    var player:AVPlayer?
    var playerItem:AVPlayerItem?
    
    (省略)
    
    override func viewWillAppear(_ animated:Bool)
    {
        super.viewWillAppear(animated)
        avPlayerController?.view.frame = UIScreen.main.bounds
        self.addChildViewController(avPlayerController!)
        self.view.addSubview((avPlayerController?.view)!)
        self.avPlayerController?.player?.play()
    }
    
    func initItem(item:AVPlayerItem)
    {
        playerItem = item
        player = AVPlayer(playerItem:playerItem)
        avPlayerController = AVPlayerViewController()
        avPlayerController?.player = player
    }
    
[/code]


CC BY-SA 3.0
2017-06-07T06:17:15.003
35364
2017-06-07T06:17:15.003
35186
answer