我是 Swift 新手,一直在 SwiftUI 4.0 中使用新的 PhotosPicker。我能夠顯示選定的影像,但不能顯示視頻。當我選擇一個視頻時,我可以獲得如下幾條資訊
PhotosPickerItem(_itemIdentifier:可選(“40F724uF-24M7-4523-9B2B-AD43FB2C7D71/L0/001”),_shouldExposeItemIdentifier:假,_supportedContentTypes:[<_UTCoreType 0x106c4cd60> com.apple.quicktime-movie(非動態,已宣告)],_itemProvider : <PUPhotosFileProviderItemProvider: 0x600003ea05a0> {types = ( "com.apple.quicktime-movie" )})
我想知道是否有某種方式可以使用該專案識別符號來加載所選視頻。我一直在查看不同的示例,但沒有一個顯示 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()
}
}
uj5u.com熱心網友回復:
您可以使用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://www.uj5u.com/shujuku/521062.html
標籤:IOS迅速迅捷
