首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在AVQueuePlayer中播放完最后一项后显示工作表视图?

在AVQueuePlayer中播放完最后一项后显示工作表视图,可以通过以下步骤实现:

  1. 创建AVQueuePlayer对象,并将需要播放的AVPlayerItem添加到队列中。
  2. 监听AVPlayerItemDidPlayToEndTime通知,该通知在每个AVPlayerItem播放结束时触发。
  3. 在通知的回调方法中,判断当前播放的AVPlayerItem是否为队列中的最后一个。
  4. 如果是最后一个AVPlayerItem,创建并显示一个工作表视图(UIAlertController)。
  5. 在工作表视图中添加所需的操作按钮,例如继续播放下一个视频、重新播放队列等。
  6. 根据用户的选择,执行相应的操作。

以下是示例代码:

代码语言:txt
复制
import AVFoundation
import UIKit

class ViewController: UIViewController {
    var queuePlayer: AVQueuePlayer?
    var playerItems: [AVPlayerItem] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 创建AVPlayerItem并添加到队列中
        let videoURLs = ["video1.mp4", "video2.mp4", "video3.mp4"]
        for url in videoURLs {
            if let videoURL = Bundle.main.url(forResource: url, withExtension: nil) {
                let playerItem = AVPlayerItem(url: videoURL)
                playerItems.append(playerItem)
            }
        }
        
        // 创建AVQueuePlayer并设置队列
        queuePlayer = AVQueuePlayer(items: playerItems)
        
        // 监听AVPlayerItemDidPlayToEndTime通知
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: nil)
        
        // 播放第一个视频
        queuePlayer?.play()
    }
    
    @objc func playerDidFinishPlaying(notification: Notification) {
        guard let currentItem = queuePlayer?.currentItem else {
            return
        }
        
        // 判断当前播放的AVPlayerItem是否为队列中的最后一个
        if currentItem == playerItems.last {
            // 创建工作表视图
            let alertController = UIAlertController(title: "播放完成", message: "是否继续播放下一个视频?", preferredStyle: .actionSheet)
            
            // 添加继续播放按钮
            let continueAction = UIAlertAction(title: "继续播放", style: .default) { (_) in
                // 播放下一个视频
                self.queuePlayer?.advanceToNextItem()
            }
            alertController.addAction(continueAction)
            
            // 添加重新播放按钮
            let replayAction = UIAlertAction(title: "重新播放", style: .default) { (_) in
                // 重新播放队列中的第一个视频
                self.queuePlayer?.seek(to: CMTime.zero)
                self.queuePlayer?.play()
            }
            alertController.addAction(replayAction)
            
            // 添加取消按钮
            let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
            alertController.addAction(cancelAction)
            
            // 显示工作表视图
            present(alertController, animated: true, completion: nil)
        }
    }
}

这是一个基本的示例,你可以根据实际需求进行修改和扩展。在这个示例中,AVQueuePlayer用于播放一个视频队列,并在播放完最后一个视频后显示一个工作表视图,提供继续播放下一个视频或重新播放队列的选项。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架的视频流App的构建

当您想对事物的工作方式进行非常具体的控制时,最好编写自己的视频视图。 让事情顺利进行是你的工作。...没错,这是一个特殊的子类,叫做AVQueuePlayer。 正如您可能从名称猜到的那样,此类允许您提供要播放的项目队列。...3) 最后,您使用 insert(_:after:) 将每个项目添加到队列。...play() 默认情况下,这会将您的循环剪辑显示设置为自动播放和音频关闭。 构建并运行以查看您的完整工作剪辑节目! 不幸的是,当最后一个剪辑播放完,视频播放器会变黑。 3....这表明添加自定义控件以与自定义视频视图交互是多么容易。 现在,您只需轻按一下即可提高音量并进入快状态。 5.

6.9K10

视频无缝续的一些解决方案

事实上我并不是自由工作者,我也是众多打工大军中平平凡凡的一员,只是之前在找工作,除了出去面试就是整理一下以前学习过一些技术要点,顺带发表共享一下而已。...View从原先的布局移除掉,然后插入到要显示的布局。...对于使用切换surfaceView的原理是解码器动态关联不同的渲染视图(RenderView),比如使用MediaPlayer动态关联SurfaceView,就如同一个电脑主机不断连接不同的显示器。...总的来说就是需要保证播放器的surfaceView在切换前和切换显示的图像内容是一样的。这个是一个重难点。...多个播放器的方案: 在点击切换码流的时候,让原来的播放器继续工作,然后新开一个播放器后台异步准备新的播放源,准备完毕,使用新的播放器seek到原来的播放器播放的时间位置,最后显示新的播放器,隐藏并销毁原来的旧播放器

2.2K10

02.视频播放器整体结构

使用简单,代码拓展性强,封装性好,主要是和业务彻底解耦,暴露接口监听给开发者处理业务具体逻辑 该播放器整体架构:播放器内核(自由切换) + 视频播放器 + 边边缓存 + 高度定制播放器UI视图层 项目地址...视频底图(用于显示初始化视频时的封面图),视频状态视图【加载loading,播放异常,加载视频失败,播放完成等】 改变亮度和声音【改变声音视图,改变亮度视图】,改变视频快进和快退,左右滑动快进和快退视图...这个每个实现类则都可以拿到这些属性呢 在BaseVideoController中使用LinkedHashMap保存每个自定义view视图,添加则put进来然后通过addView将视图添加到该控制器,...比如播放需要更新UI进度条,播放异常需要显示异常UI,都比较难处理播放器状态变化更新UI操作 UI难以自定义或者修改麻烦 比如常见的视频播放器,会把视频各种视图写到xml,这种方式在后期代码会很大,...有播放完成,播放异常,播放加载,顶部标题栏,底部控制条栏,锁屏,以及手势滑动栏。如何控制它们的显示隐藏切换呢? 在addView这些视图时,大多数的view都是默认GONE隐藏的。

1.7K10

研发直播APP的收获-iOS

视图 1、GiftView 显示礼物,管理小礼物与豪华礼物动画; 核心: 小礼物连击效果,队列存储豪华礼物消息,播放完毕回调。...GPUImage 采集视频,并对视频流进行美颜处理; 3、RMStore 苹果内购支持; 4、SDWebImage 负责加载图片,包括头像、礼物图片等; 业务问题分析 1、聊天室消息过多 产品运营一段时间,...消息量不断攀升,最高到100billion,后来IM方优化,量级稳定在10billion,但是消息量仍旧过大。...解决方案: 1、改用HTTPS; 2、添加校验码; 解释下方案2,把所有的get参数,key按照字符串顺序排序,value用"/"串起来,最后再加一串特定的字符,最终对这串值进行MD5,把MD5的串添加到...欢迎私信探讨,工作上的焦虑与迷茫。

1.7K60

这次彻底搞懂Android补间动画

作用对象: 视图控件(View) Android的TextView、Button等等 不可作用于View组件的属性,:颜色、背景、长度等等 原理与分类: 通过确定开始的视图样式 & 结束的视图样式...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为

1.2K20

01.视频播放器框架介绍

显示不操作会5秒自动消失【也可以设置n秒消失时间】 B高级功能 B.1.1 支持一遍播放一遍缓冲的功能,其中缓冲包括两部分,第一种是播放过程缓冲,第二种是暂停过程缓冲 B.1.2 基于ijkPlayer...视频常见的布局视图 视频底图(用于显示初始化视频时的封面图),视频状态视图【加载loading,播放异常,加载视频失败,播放完成等】 改变亮度和声音【改变声音视图,改变亮度视图】,改变视频快进和快退,...比如播放需要更新UI进度条,播放异常需要显示异常UI,都比较难处理播放器状态变化更新UI操作 UI难以自定义或者修改麻烦 比如常见的视频播放器,会把视频各种视图写到xml,这种方式在后期代码会很大,...,任何在模式创建对象的工厂类必须实现这个接口 ExoPlayerFactory:具体工厂,具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建具体产品对象。...比如播放需要更新UI进度条,播放异常需要显示异常UI,都比较难处理播放器状态变化更新UI操作 这个是指该视频播放器能否看了文档快速上手,知道封装的大概流程。

2.6K51

OSPFv3:第三版OSPF除了支持IPv6,还有这些强大的特性!

支持多 4. 支持更多的地址族 5. 简化的配置 OSPFv3的工作原理 1. 路由器(Router) 2. 接口(Interface) 3. 区域(Area) 4....除了IPv6地址,它还可以处理其他类型的地址,IPv4、IPX等。这使得网络管理员能够在同一网络同时管理多种类型的地址。 5....[interface-type] [interface-number] ip ospf [process-id] area [area-id] end write memory 请注意,上述配置示例的占位符...通过了解OSPFv3的工作原理和配置步骤,网络管理员可以有效地管理和优化复杂的IPv6网络拓扑结构。在未来的网络演进,OSPFv3将继续发挥重要的作用,为IPv6网络的发展提供支持。...如何在Cisco设备上停止Traceroute或Ping? 如何在 Linux 从备份恢复 Crontab?

51130

Android:这是一份全面 & 详细的补间动画使用教程

视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...在组合动画里scale缩放动画设置的repeatCount(重复播放)和fillBefore(播放完视图是否会停留在动画开始的状态)是无效的。 // 2.

1.9K20

Android 动画:手把手教你使用 补间动画 (视图动画)

视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...在组合动画里scale缩放动画设置的repeatCount(重复播放)和fillBefore(播放完视图是否会停留在动画开始的状态)是无效的。 // 2.

2.6K20

04.视频播放器通用架构实践

比如播放需要更新UI进度条,播放异常需要显示异常UI,都比较难处理播放器状态变化更新UI操作 UI难以自定义或者修改麻烦 比如常见的视频播放器,会把视频各种视图写到xml,这种方式在后期代码会很大,...这个每个实现类则都可以拿到这些属性呢 在BaseVideoController中使用LinkedHashMap保存每个自定义view视图,添加则put进来然后通过addView将视图添加到该控制器,...有播放完成,播放异常,播放加载,顶部标题栏,底部控制条栏,锁屏,以及手势滑动栏。如何控制它们的显示隐藏切换呢? 在addView这些视图时,大多数的view都是默认GONE隐藏的。...比如当视频初始化时,先缓冲则显示缓冲view而隐藏其他视图,接着播放则显示顶部/底部视图而隐藏其他视图 比如有时候需要显示两种不同的自定义视图如何处理 举个例子,播放的时候,点击一下视频,会显示顶部title...比如播放第一个视频就把player对象添加到视图中,点击播放第三个时需要把player从它的父布局移除然后再添加到该item的布局,这样就可以实现 list条目中滑动item不可见就停止视频播放

2.4K00

数据仓库建设之数仓架构

如果前面的工作做得好,这些数据将被以保证最重要的和最频繁的查询能够快速执行的方式构建。 这里的原始数据存储和转换的数据存储是逻辑概念,它们可能物理存储在一起,也可能分开。...作为通用的需求,所有数据仓库系统都应该能够建立周期性自动执行的工作流作业。传统数据仓库一般利用操作系统自带的调度功能(Linux的cron或Windows的计划任务)实现作业自动执行。...传统数据仓库,它可能是存储转换数据的Oracle、MySQL等关系数据库系统内置的查询引擎,还可能是以固定时间间隔向其导入数据的OLAP立方体,Essbase cube。...速度层 通过提供最新数据的实时视图来最小化延迟。速度层所生成的数据视图可能不如批处理层最终生成的视图那样准确或完整,但它们几乎在收到数据立即可用。...(3)当新作业赶上进度,应用切换数据源,读取 2 中产生的新结果。 (4)停止老的作业,删除老的结果

1.3K30

什么是igmp协议_igmpv3协议

路由器收到leave报文,会发送指定组查询报文,询问该网段内是否还有主机希望接收该组的组 网段内还有该组接收者,则该接收者会向路由器回复membership-report报文,通告路由器本机还希望接收该组...;如果不希望接收该组,则不回复 接收到membership-report报文,则不对组组信息做任何操作;没有接收到任何报文,则删除该组组信息 查询器选举 自动选举 IP地址小的优先 成员报告抑制机制...、报文会包含希望变更的组组地址、离开的源地址 2.路由器收到该报文,会发送指定组查询报文,询问是否还有其他主机希望继续接受该组源在该组地址发送的组 3.如果未收到回复,路由器则在组状态删除该组源...IGMP Snooping的情况下,默认把组播报文当做广播处理 工作原理: 1.开启IGMP Snooping,交换机会把收到普遍查询报文的接口设置为路由器接口 2.交换机只会把从路由器接口收到的组播报文转发至成员端口...IRF堆叠协议热备份 堆叠组内的所有交换机会自动同步配置文件,但是成员交换机允许过程中产生缓存表项并不包含在配置文件 热备份机制会自动吧运行过程的缓存表项进行同步,比如邻居、协议路由、ARP

1.1K40

Carson带你学Android:手把手带你全面学习补间动画的使用!

视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...,视图是否会停留在动画开始的状态,默认为true android:fillAfter = “false” // 动画播放完视图是否会停留在动画结束的状态,优先于fillBefore值,默认为...在组合动画里scale缩放动画设置的repeatCount(重复播放)和fillBefore(播放完视图是否会停留在动画开始的状态)是无效的。 // 2.

82050

Android Studio3.0新特性及安装图文教程

,语义突出显示,搜索的即时结果等等。...(4).新的Android Profiler Android Studio 3.0的新型Android Profiler提供了对应用程序活动的实时统一视图。...(8).支持Android O开发者预览 一个新的自适应图标向导,允许您创建新的自适应启动器图标资源,并预览它们将如何在不同的设备上显示。...} } (13).APK分析仪的改进 显示以前可用的包,类和方法之外的字段 顶部显示和隐藏字段和方法的新过滤选项 在树视图中,以斜体显示的节点是未在DEX文件定义的引用 对于启用Proguard构建的...放完之后重启Android Studio3.0。 (2).未安装稳定版: 未安装稳定版就直接默认选项安装就可以了! 写的仓促,有错的地方见谅。

4.1K00

【智能家居】

在页面链接识别应用程序播放的音频类型 在iOS、tvOS和watchOS,将音频会话的路由共享策略设置为. longform。长格式音频是除了系统声音之外的任何东西,比如音乐、有声书或客。...如果你的应用程序有一个不同的角度来组织一个家,不要让他们重新设置他们的家的全部或部分,或者通过显示重复的设置视图来使人们感到困惑。...设置完成,在应用程序中找到有用的地方来帮助人们了解这些类型的命令。例如,在场景细节视图中,你可以告诉人们,你可以说“嘿Siri,设置‘电影时间’。”...var accessoryDelegates = Set() }  您创建一个配件列表集合视图控制器来显示连接的配件列表。...启用自定义配置 当用户点击配件的信息按钮时,应用程序就会显示有关配件的详细信息。在详细视图中,用户可以重命名配件,将其分配到一个房间,将其从家中移除,并查看设备信息,固件版本。

28620

madplay源代码导读

反初始化音频 } play_all(struct player *player) {    初始化节目单    如果是随机模式,则初始化随机节目单   play_one(player)  小循环,必需完一个节目再退出来...  一个节目播放完,或者被滤波打断,小循环跳出播放下一首后上一首歌 等动作。...filter_run()完成每个filter函数动作,:mono_filter,gain_filter,mixer_filter,fadein_filter,tty_filter等动作 5.      ...如何显示播放时间: 1.在每帧输出到底层驱动是显示或者键盘按I字母时显示 show_status(&player->stats, header,0, 0); 先将实际独到time_str mad_timer_string...送入顶层驱动有有很多OSS,alsa,win32等, Config.h文件设置默认为oss #define AUDIO_DEFAULT audio_oss 可以根据实际情况就行更改。

1.1K40

数据库PostrageSQL-统计收集器

为了降低用户预期一种不同的滞后模型带来的混淆,在一个完全重放完的闲置系统上,lag列会在一段比较短的时间回复成NULL。监控系统应该选择将这种情况表示为缺失数据、零或者继续显示最近的已知值。...每一个订阅的主工作者都在pg_stat_subscription视图中有一行(如果工作者没有运行则PID为空),处理被订阅的初始数据拷贝操作的工作者还会有额外的行。...pg_stat_all_tables视图将为当前数据库的每一个(包括 TOAST )包含一行,该行显示与对该的访问相关的统计信息。...pg_statio_all_tables视图将为当前数据库的每个(包括 TOAST )包含一行,该行显示指定上有关 I/O 的统计信息。...如要了解函数名等细节,可参考标准视图的定义(例如,在psql你可以发出\d+ pg_stat_activity)。

84430

BGP

建立连接,BGP邻居之间交换整个BGP路由。...路由引入 BGP协议自身不能发现路由,所以需要引入其他协议的路由(IGP或者静态路由等)注入到BGP路由,从而将这些路由在AS之内和AS之间传播。...配置自动聚合,BGP将按照自然网段聚合路由(10.1.1.1/32和10.2.1.1/32将聚合为A类地址10.0.0.0/8),并且BGP向对等体只发送聚合的路由。...传统的BGP-4只能管理IPv4单播路由信息,对于使用其它网络层协议(IPv6、组等)的应用就受到一定限制。...MP-BGP可以同时为单播和组维护路由信息,将它们储存在不同的路由,保持单播和组之间路由信息相互隔离。 MP-BGP可以同时支持单播和组模式,为两种模式构建不同的网络拓扑结构。

1.7K20

全网超详细的HCIA学习笔记,值得收藏慢慢学习!(二)

系统视图 配置系统参数以及通过该视图进入其他的功能配置视图。 其他视图 :接口视图、协议视图,进行相关的参数配置。...) 路由设备的接口IP地址 火车站的地址 总结:当路由器收到一个IP数据包时,查看IP头部的目的IP地址,并在路由中进行查 找,在匹配到最优的路由,将数据包发给该路由所指的出接口或下一跳。...255条,不仅工作量极大,也使得R1的路由极为臃肿。...Routing Protocol 单播路由协议 指导单播数据的发送 :RIP、EIGRP、OSPF、BGP、IS-IS Routing Protocol 组路由协议 指导组数据的发送 :DVMRP...LSDB(链路状态数据库、地图) 3、使用SPF算法计算到每个目标网络的最短距离 4、生成路由表项加载路由 OSPF三张 名称 备注 邻居 记录所有邻居信息 链路状态数据库(LSDB) 记录所有链路状态信息

1.4K30
领券