首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SwiftUi如何从项标识符加载选定的视频

SwiftUi如何从项标识符加载选定的视频
EN

Stack Overflow用户
提问于 2022-10-26 02:29:05
回答 1查看 93关注 0票数 0

我是Swift的新手,在SwiftUI 4.0中使用了新的SwiftUI。我能够显示选定的图像,但不能显示视频。当我选择一个视频时,我可以得到如下几条信息

Optional("40F724uF-24M7-4523-9B2B-AD43FB2C7D71/L0/001"),PhotosPickerItem(_itemIdentifier:_itemIdentifier _shouldExposeItemIdentifier: false,_supportedContentTypes:<_UTCoreType 0x106c4cd60> com.apple.Quicktime-_itemIdentifier(非动态,已声明),_itemProvider: {type=(“com.apple.Quicktime-PhotosPickerItem”)})

我想知道是否有某种方式,我可以使用该项目标识符,以加载选定的视频。我一直在看不同的例子,但没有一个为PhotosPicker播放视频。我有一个很小的项目,我正在测试这个项目,任何建议都会很好。

代码语言:javascript
代码运行次数:0
运行
复制
     import SwiftUI
     import Combine
     import PhotosUI
     import AVKit

    struct PlayVideoView: View {
    @State private var selectedItem: [PhotosPickerItem] = []
    @State private var data: Data?
    @State var player = AVPlayer(url: URL(string: "https://swiftanytime-content.s3.ap-south-1.amazonaws.com/SwiftUI-Beginner/Video-Player/iMacAdvertisement.mp4")!)
    
    var body: some View {
        PhotosPicker(selection: $selectedItem,
                     maxSelectionCount: 1,
                     matching: .any(of: [.images,.videos])) {
            Image(systemName: "photo")
                .resizable()
                .foregroundColor(.blue)
                .frame(width: 24, height: 24)
                .padding(.top, 5.0)
        }.onChange(of: selectedItem) { newMedia in
            Task {
                guard let item = selectedItem.first else {
                    return
                }
                item.loadTransferable(type: Data.self) { result in
                    
                    switch result {
                    case .success(let data):
                        if let data = data {
                            print(item) // get video url here and display in videoplayer
                            self.data = data
                            
                        } else {
                            print("data is nil")
                        }
                    case .failure(let failure):
                        fatalError("\(failure)")
                    }
                }
            }
        }
        VideoPlayer(player: player) // selected video url should go here
             .frame(width: 400, height: 300, alignment: .center)
    }
}

struct PlayVideoView_Previews: PreviewProvider {
    static var previews: some View {
        PlayVideoView()
     }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-26 06:03:16

您可以使用来自https://github.com/zunda-pixel/SamplePhotosPicker的代码来尝试这种方法。这里复制的Movie代码使用TransferRepresentation来表示来自临时文件的url。

代码语言:javascript
代码运行次数:0
运行
复制
import Foundation
import SwiftUI
import PhotosUI
import AVKit
import CoreTransferable


// from: https://github.com/zunda-pixel/SamplePhotosPicker
struct Movie: Transferable {
  let url: URL

  static var transferRepresentation: some TransferRepresentation {
    FileRepresentation(contentType: .movie) { movie in
      SentTransferredFile(movie.url)
    } importing: { receivedData in
      let fileName = receivedData.file.lastPathComponent
      let copy: URL = FileManager.default.temporaryDirectory.appendingPathComponent(fileName)

      if FileManager.default.fileExists(atPath: copy.path) {
        try FileManager.default.removeItem(at: copy)
      }

      try FileManager.default.copyItem(at: receivedData.file, to: copy)
      return .init(url: copy)
    }
  }
}

struct ContentView: View {
    var body: some View {
        PlayVideoView()
    }
}

struct PlayVideoView: View {
    @State private var selectedItem: [PhotosPickerItem] = []
    @State var player = AVPlayer(url: URL(string: "https://swiftanytime-content.s3.ap-south-1.amazonaws.com/SwiftUI-Beginner/Video-Player/iMacAdvertisement.mp4")!)
    
    var body: some View {
        PhotosPicker(selection: $selectedItem,
                     maxSelectionCount: 1,
                     matching: .any(of: [.images,.videos])) {
            Image(systemName: "photo")
                .resizable()
                .foregroundColor(.blue)
                .frame(width: 24, height: 24)
                .padding(.top, 5.0)
        }.onChange(of: selectedItem) { newMedia in
            Task {
                guard let item = selectedItem.first else {  return }
                item.loadTransferable(type: Movie.self) { result in   // <-- here
                    switch result {
                    case .success(let movie):
                        if let movie = movie {
                            player = AVPlayer(url: movie.url) // <-- here
                        } else {
                            print("movie is nil")
                        }
                    case .failure(let failure):
                        fatalError("\(failure)")
                    }
                }
            }
        }
        VideoPlayer(player: player)
            .frame(width: 400, height: 300, alignment: .center)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74202070

复制
相关文章

相似问题

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