Swift 2 AVPlayer - 播放下一个视频 上一个视频

Posted

技术标签:

【中文标题】Swift 2 AVPlayer - 播放下一个视频 上一个视频【英文标题】:Swift 2 AVPlayer - Play Next video Previous Video 【发布时间】:2016-03-30 05:40:42 【问题描述】:

我对这部分的研究不止一天。请提出任何想法。

我必须完成才能播放视频。我有一个视频列表。如果用户将其设为全屏视频,则启用上一个和下一个播放器按钮,并在点击时播放。

这是我的代码;

         var commmentQueuePlayer = AVQueuePlayer()
         var items = [AVPlayerItem]()
         if let player = comPlayerControl 

            let videoURL: String = "http://cdnapi.kaltura.com/p/11/sp/11/playManifest/entryId/0_6swapj1k/format/applehttp/protocol/http/a.m3u8"
            let firstItemURL: String = "http://cdnapi.kaltura.com/p/11/sp/11/playManifest/entryId/0_2p3957qy/format/applehttp/protocol/http/a.m3u8"
            let secondItemURL: String = "http://cdnapi.kaltura.com/p/11/sp/11/playManifest/entryId/0_buy5xjol/format/applehttp/protocol/http/a.m3u8"


            let firstItem = AVPlayerItem(URL: NSURL(string: firstItemURL)! )
            let secondItem = AVPlayerItem(URL: NSURL(string: secondItemURL)! )
            let playerItem = AVPlayerItem(URL: NSURL(string: videoURL)! )

            items = [firstItem,secondItem,playerItem]
            commmentQueuePlayer = AVQueuePlayer(items: items)

            player.player = commmentQueuePlayer
            player.view.frame = videoCell.frame
            player.view.sizeToFit()
            player.showsPlaybackControls = true
            videoCell.addSubview(player.view)
           // comPlayerControl.player?.play()
        

这里发生的事情是一次播放开始第二个。像一个队列。

请告诉我使用 AVQueuePlayerController 或 AVPlayerController 是否合适。

请任何人帮助我。我谷歌了,很遗憾,我找不到解决方案。

我想知道我可以触发下一个上一个播放器图标

请提出建议。

【问题讨论】:

所以您想在点击相应的按钮时播放下一个/上一个视频?这部分没听懂你想说的What is happening here is once playing start second one. like a Queue. 是的。试想一下,一旦用户表以全屏模式打开并播放,我在 tableview 中有一个视频预览列表。播放完成后,不想返回选择下一个视频,在这种情况下,用户单击下一个按钮将播放下一个视频,如果用户单击上一个,如果有上一个项目,则播放 很难相信没有办法启用这些按钮。我没有找到快速的方法。我发现推荐编写自己的海关视频播放器。作为参考可以是这样的:binarymosaic.com/custom-video-player-for-ios-with-avfoundation 感谢您的回复。我有一个关于在播放完成后调用视频顶部的自定义按钮的问题。 ***.com/questions/33653805/…‌​-in-subview-using-auto-layout 所以。您不想启用默认播放器下一个上一个按钮,但您想在播放器顶部添加其他按钮。对吗? 【参考方案1】:

我确实创建了一个demo project,其中展示了如何将自定义按钮放在 AVPlayer 之上,并且它们会响应点击。

做了什么:

创建的 Xib(使用自动布局)文件包含自定义按钮,例如下一步、重播等。 按钮已连接到打印需要执行的操作的源。喜欢:下一个播放或重播。 添加了观察者,用于观察视频何时播放完毕。 视频播放完毕后,将显示带有按钮的 xib 文件。

【讨论】:

感谢您的回复。请告诉我如何调用methof。我确实喜欢这个let vc = ViewController() vc.setupPlayer()。这里ERROR: 181: timed out after 0.012s (612 613); mMajorChangePending=0 您是否一直收到此错误?可以打赌,该服务器没有响应吗?我看到人们在播放声音时遇到此错误。 forums.developer.apple.com/thread/19902【参考方案2】:

我建议使用 AVQueuePlayer。当前项目播放完毕后,队列播放器将自动播放队列中的下一个项目。要记住的一个想法是,在 AVPlayerItem 播放完毕后,它将从队列中删除,因此如果您要倒退,您将不得不重置队列或手动将新项目添加到队列here is an implementation of this。

在 Swift 中重置队列应该是这样的

func resetVideoQueue(video: string)

    if let videos = Videos 

        var queue: [AVPlayerItem] = []

        switch video 
        case "vid1":
            queue.append(AVPlayerItem(URL: NSURL(string: videos["vid1"])!))
            queue.append(AVPlayerItem(URL: NSURL(string: videos["vid2"])!))
            queue.append(AVPlayerItem(URL: NSURL(string: videos["vid3"])!))
            queue.append(AVPlayerItem(URL: NSURL(string: videos["vid4"])!))
            break
        case "vid2":
            queue.append(AVPlayerItem(URL: NSURL(string: videos["vid2"])!))
            queue.append(AVPlayerItem(URL: NSURL(string: videos["vid3"])!))
            queue.append(AVPlayerItem(URL: NSURL(string: videos["vid4"])!))
            break
        case "vid3":
            queue.append(AVPlayerItem(URL: NSURL(string: videos["vid3"])!))
            queue.append(AVPlayerItem(URL: NSURL(string: videos["vid4"])!))
            break
        case "vid4":
            queue.append(AVPlayerItem(URL: NSURL(string: videos["vid4"])!))
            break
        

        setVideoPlayer(queue)
    



internal func setVideoPlayer(queue: [AVPlayerItem]) 
    queuePlayer = AVQueuePlayer(items: queue)       
    videoPlayerViewController.player = queuePlayer
    presentViewController(videoPlayerViewController, animated: true) 
        self.videoPlayerViewController.player?.play()
    

要移动到下一个项目,请使用 MrHaze 建议的 AdvanceToNextItem() 方法。

【讨论】:

我的要求是,一旦播放完成,用户可以选择上一个或下一个视频。在此解决方案中,用户不能单击上一个选项。你能告诉我如何解决这个问题的上一个或下一个项目。它会工作默认 AVPlayerController 的下一个上一个吗? 一旦视频播放完毕,queuePlayer 会自动播放下一个视频,我的理解是您尝试使用的按钮是用于快进和快退媒体资产,这可能不适用于流式传输视频,建议here。您可能需要为播放器添加自定义控制器。 AVQueuePlayer 类没有原生的 previousItem 选项,因为队列中的项目在完成播放后会被删除。您还可以使用 NSNotifications,例如 this

以上是关于Swift 2 AVPlayer - 播放下一个视频 上一个视频的主要内容,如果未能解决你的问题,请参考以下文章

Swift 应用程序上的 AVPlayer 显示黑屏,但在播放视频时播放音频

AVPlayer 自动播放但不应该(Swift)

我无法在 swift 2.3 中播放保存在目录路径和 AVPlayer 中的视频

在 AVPlayer [Swift] 中播放 MPMediaItemCollection 中的项目

Swift,如何在 AVPlayer 上播放视频期间获得事件点击完成按钮?

为啥 Swift 的 AVPlayer 一次播放会加载 playerItem 两次?