我是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播放视频。我有一个很小的项目,我正在测试这个项目,任何建议都会很好。
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()
}
}
发布于 2022-10-26 06:03:16
您可以使用来自https://github.com/zunda-pixel/SamplePhotosPicker的代码来尝试这种方法。这里复制的Movie
代码使用TransferRepresentation
来表示来自临时文件的url。
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)
}
}
https://stackoverflow.com/questions/74202070
复制相似问题