首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将“`AVPlayerView`”包装在“`SwiftUI`”中的最佳实践?

将“`AVPlayerView`”包装在“`SwiftUI`”中的最佳实践?
EN

Stack Overflow用户
提问于 2022-07-24 15:56:51
回答 1查看 113关注 0票数 1

我想把AVPlayerView包装成SwiftUI。这是我的密码(操场):

代码语言:javascript
复制
import PlaygroundSupport
import SwiftUI
import AVKit

class RecorderPlayerModel: ObservableObject {
    @Published var playerView: AVPlayerView

    init() {
        self.playerView = AVPlayerView()
        self.playerView.player = AVPlayer()
    }

    func reload(url: URL) {
        let asset = AVAsset(url: url)
        let item = AVPlayerItem(asset: asset)
        self.playerView.player?.replaceCurrentItem(with: item)
    }
}

struct RecorderPlayerView: NSViewRepresentable {
    typealias NSViewType = AVPlayerView

    var playerView: AVPlayerView

    func makeNSView(context: Context) -> AVPlayerView {
        return playerView
    }

    func updateNSView(_ nsView: AVPlayerView, context: Context) {}

}

struct ContentView: View {
    @StateObject var playerViewModel: RecorderPlayerModel = .init()

    var body: some View {
        VStack {
        RecorderPlayerView(playerView: playerViewModel.playerView)
            .clipShape(RoundedRectangle(cornerRadius: 8))
            .onAppear {
               let fileManager = FileManager.default
                if let url = URL(string: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerMeltdowns.mp4") {
                    Task {
                        do {
                            let (data, _) = try await URLSession.shared.data(from: url)

                            let fileUrl = fileManager.temporaryDirectory.appendingPathComponent("sample")
                                .appendingPathExtension(for: .mpeg4Movie)

                            try? fileManager.removeItem(at: fileUrl)
                            fileManager.createFile(atPath: fileUrl.path, contents: data)

                            playerViewModel.reload(url: fileUrl)
                        } catch {
                            print(error)
                        }
                    }
                }
            }

            Button {
                if playerViewModel.playerView.canBeginTrimming {
                    Task {
                        await playerViewModel.playerView.beginTrimming()
                    }
                }
            } label: {
                Text("trim")
            }
        }.frame(width: 500, height: 500, alignment: .center)
    }
}

PlaygroundPage.current.setLiveView(ContentView())

由于我想修剪视频,我不能直接使用VideoPlayer。但是在将AVPlayerView包装到NSViewRepresentable视图之后,trim视图总是会失去交互性。

复制方式:剪裁时双击anywhere

补充

当失去交互性时,控制台将记录

代码语言:javascript
复制
-[AVTrimIndicatorAccessibilityElement accessibilityHitTest:]: unrecognized selector sent to instance 0x600001916ce0

已更新

它并不是在所有型号的Mac上触发的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-04 05:22:04

我解决了问题。将.clipShape(...)应用于RecorderPlayerView似乎会造成问题。

只要删除行.clipShape(RoundedRectangle(cornerRadius: 8))就可以解决这个问题。

代码语言:javascript
复制
RecorderPlayerView(playerView: playerViewModel.playerView)
     // .clipShape(RoundedRectangle(cornerRadius: 8)) <-- remove this line
    .onAppear {
       ...
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73099924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档