You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中实现视频自动播放、静音且循环播放的问题

SwiftUI中实现视频自动播放、静音且循环播放的问题

嘿,我完全懂你现在的困扰!你已经搞定了视频自动播放和静音的需求,就差循环播放这一步对吧?其实AVPlayer本身确实没有直接设置循环的属性,不过苹果给我们提供了AVPlayerLooper配合AVQueuePlayer的方案,这是官方推荐的实现无缝循环的方式,我来给你调整下代码:

首先,我们需要把原来的AVPlayer换成AVQueuePlayer,因为AVPlayerLooper是专门和队列播放器配合使用的。然后创建一个AVPlayerLooper实例,把单个视频item和队列播放器绑定,这样就能实现单视频的循环播放了。另外要注意把playerLooper作为视图的属性保存,不然它会被提前释放导致循环失效。

修改后的完整代码如下:

import SwiftUI
import AVKit

struct IntroductionVideo: View {  
    // 将AVPlayer替换为AVQueuePlayer,适配AVPlayerLooper
    @State private var player = AVQueuePlayer()
    // 保存AVPlayerLooper实例,防止被提前释放
    private var playerLooper: AVPlayerLooper?

    var body: some View {
        VideoPlayer(player: player)
            .aspectRatio(contentMode: .fit)
            .onAppear {
                // 安全校验URL,避免强制解包崩溃
                guard let videoURL = URL(string: "https://example.com/video.mp4") else {
                    print("视频URL无效,请检查地址")
                    return
                }
                let playerItem = AVPlayerItem(url: videoURL)
                // 创建循环播放器,绑定队列播放器和单个视频item
                playerLooper = AVPlayerLooper(player: player, templateItem: playerItem)
                // 设置静音和自动播放
                player.isMuted = true
                player.play()
            }
            .disabled(true)
    }
}

几个关键的点给你说明下:

  • AVQueuePlayer的作用:它是AVPlayer的子类,支持播放多个item的队列,AVPlayerLooper就是用来让这个队列里的内容循环播放的,我们这里只放一个item,就实现了单视频循环。
  • playerLooper的生命周期:如果只是在onAppear里创建局部的AVPlayerLooper,方法执行完它就会被销毁,循环也就失效了,所以必须把它作为视图的属性来持有。
  • URL安全校验:去掉了原来的强制解包,换成了guard let,这样如果URL无效的话会打印提示,不会直接崩溃,代码更健壮。

如果你的视频是本地资源,只需要把URL换成Bundle.main.url(forResource: "你的视频文件名", withExtension: "mp4")就可以了,逻辑是完全一样的~

备注:内容来源于stack exchange,提问作者Ilja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 10:44:32