TransferRepresentation slow transfer for large video files.

Hi, I notice a very slow transfer rate when I try to transfer a file picked via .photosPicker. This happens especially when I try to import a 4k/60fps video.

SwiftUI:

VStack {
    Button("Pick a video") {
        model.isPhotoPickerView = true
     }
     .photosPicker(isPresented: $model.isPhotoPickerView, selection: $model.selectedImageList, maxSelectionCount: 1, matching: .videos)
     .onChange(of: model.selectedImageList, { old, new in
            model.handlePhotoPicker()
      })
}

View Model to handle Photo Picker action:

private class PageModel: ObservableObject {
//other methods

    @MainActor
    public func handlePhotoPicker() {
        
        if selectedImageList.isEmpty  {
            return
        }
        
        guard let item = selectedImageList.first else {
            return
        }
       
        Task {
            do {
                if let video = try await item.loadTransferable(type: VideoTransferable.self) {
                    let file = video.url
                    
                    //video url arrived 
                }
            } catch {
                //handle error
            }
        }
    }

}

Now the VideoTransferable :

struct VideoTransferable: Transferable {
    let url: URL

    static var transferRepresentation: some TransferRepresentation {
        FileRepresentation(contentType: .movie) { video in
            SentTransferredFile(video.url)
        }
        importing: { received in
//takes too much time to import large 4K video recorded from iPhone's main camera
            let copy = FileManager.documentsDirectory.appendingPathComponent(FolderType.temp.rawValue).appendingPathComponent("video_\(Int64(Date().timeIntervalSince1970 * 1000)).MOV")
            if FileManager.default.fileExists(atPath: copy.path) {
                try FileManager.default.removeItem(at: copy)
            }
            try FileManager.default.copyItem(at: received.file, to: copy)
            return Self.init(url: copy)
        }
    }
}

To my surprise this issue doesn't happen when I use a custom UIViewControllerRepresentable to wrap UIImagePickerController() and setting videoExportPreset property of the picker to AVAssetExportPresetPassthrough

Can someone point me out where I am wrong?

Accepted Answer

You can set encoding policy to current to avoid the lengthy transcoding process.

TransferRepresentation slow transfer for large video files.
 
 
Q