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?

Answered by Engineer in 797360022

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

Accepted Answer

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

TransferRepresentation slow transfer for large video files.
 
 
Q