uikit - 在 SwiftUI 中,如何将循环添加视频作为全屏背景图像?

标签 uikit swiftui

我有一个大约 10 秒长的视频,我想在我的一个 SwiftUI View 中作为全屏背景图像循环播放。我该如何实现?

第一个想法是与 Swift 的 import AVFoundation 合作。 ,但不确定这是否是正确的路径。

最佳答案

您可以使用 AV框架系列和 UIViewRepresentable去做这个:

import SwiftUI
import AVKit

struct PlayerView: UIViewRepresentable {
    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PlayerView>) {
    }
    
    func makeUIView(context: Context) -> UIView {
        return PlayerUIView(frame: .zero)
    }
}
为了让视频循环播放,我添加了一个观察者并设置了 actionAtItemEnd.none支持循环。
当视频结束时,它将执行 playerItemDidReachEnd(...)方法并寻找视频的开头并继续循环。
该示例指向远程视频 URL。如果要指向应用程序中的文件,可以使用 Bundle.main.url这样做:
if let fileURL = Bundle.main.url(forResource: "IMG_2770", withExtension: "MOV") {
    let player = AVPlayer(url: fileURL)
    // ...
}

class PlayerUIView: UIView {
    private let playerLayer = AVPlayerLayer()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        let url = URL(string: "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8")!
        let player = AVPlayer(url: url)
        player.actionAtItemEnd = .none
        player.play()
        
        playerLayer.player = player
        playerLayer.videoGravity = .resizeAspectFill
        
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(playerItemDidReachEnd(notification:)),
                                               name: .AVPlayerItemDidPlayToEndTime,
                                               object: player.currentItem)

        layer.addSublayer(playerLayer)
    }
    
    @objc func playerItemDidReachEnd(notification: Notification) {
        if let playerItem = notification.object as? AVPlayerItem {
            playerItem.seek(to: .zero, completionHandler: nil)
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        playerLayer.frame = bounds
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            ZStack {
                PlayerView()
                    .edgesIgnoringSafeArea(.all)
            }
        }
    }
}

关于uikit - 在 SwiftUI 中,如何将循环添加视频作为全屏背景图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59937756/

相关文章:

uikit - 在 iOS 12 中自定义 UIDatePicker 中的背景和文本颜色

ios - iOS 上的 SIGTRAP 错误 – AutoreleasePoolPage::busted

ios - 刷新 UIPageViewController - 重新排序页面并添加新页面

SwiftUI - 使用 'ObservableObject' 和 @EnvironmentObject 有条件地显示 View

ios - 自动布局和 UIScrollView

swift - Xcode - 调试 View 层次结构

ios - 如何在 SwiftUI 中将项目与 VStack 内的顶部对齐?

ios - SwiftUI 背景默认为渐变

swiftui - 如何在 VisionOS 的 SwiftUI 应用程序中创建多个窗口?

swift - 解决包依赖 swiftUI 项目时出错