Невозможно удалить метаданные из полученного видео. Невозможно сохранить. Ошибка домена = AVFoundationErrorDomain Code = ⇐ IOS
-
Гость
Невозможно удалить метаданные из полученного видео. Невозможно сохранить. Ошибка домена = AVFoundationErrorDomain Code =
Я создал класс для выбора видео из галереи, файлового менеджера и камеры. Я хочу удалить информацию о местоположении GPS из видео и сохранить новое видео в галерее. В настоящее время я столкнулся с ошибкой ниже.
Невозможно сохранить Ошибка Domain=AVFoundationErrorDomain Code=-11823 «Невозможно сохранить» UserInfo={NSLocalizedRecoverySuggestion=Запрошенное имя файла уже используется. Попробуйте другое имя или местоположение файла., NSLocalizedDescription=Cannot Save, NSUderlyingError=0x600000d29860 {Error Domain=NSOSStatusErrorDomain Code=-12101 "(null)"}
Сначала я пытаюсь удалить метаданные, а затем сохранить измененное видео в галерее. Ниже приведены ключи списка:
NSPhotoLibraryUsageDescription NSPhotoLibraryAddUsageDescription Чтобы проверить функцию, просто позвоните.
VideoHandler1.shared.removeMetaData(filePath: videoPath) Класс:
публичный класс VideoHandler1: NSObject { общедоступный статический пусть общий = VideoHandler1() вар inputPath = "" вар выходной путь = "" общественная функция RemoveMetaData (filePath: String) { входной путь = путь к файлу Guard let newUrl = URL (строка: filePath) еще {возвращение} // Удаление метаданных и информации GPS RemoveMetadataAndGPSInfo(from: newUrl) { [слабое само] модифицированноеВидео в если let ModifiedVideoURL = URL (строка: ModifiedVideo) { // Сохраняем измененное видео в библиотеку фотографий self?.saveVideoToPhotoLibrary(videoURL:modifiedVideoURL) } } } } расширение VideoHandler1 { func RemoveMetadataAndGPSInfo(from videoURL: URL, обработчик: StringHandler?) { пусть актив = AVAsset (url: videoURL) let ExportSession = AVAssetExportSession (актив: актив, PresetName: AVAssetExportPresetPassthrough) пусть outputURL = saveVideoToDocumentDirectory (videoURL: videoURL) ExportSession?.outputURL = saveVideoToDocumentDirectory(videoURL: videoURL) // ExportSession?.outputFileType = AVFileType(rawValue: videoURL.pathExtension) ExportSession?.outputFileType = .mp4 // Удаление дорожек метаданных, содержащих информацию GPS ExportSession?.metadata = assets.metadata.filter {$0.key as! AVMetadataKey != AVMetadataKey.commonKeyLocation } ExportSession?.exportAsynchronous(completionHandler: { если ExportSession?.status == .completed { print("Метаданные и информация GPS успешно удалены.") обработчик?(outputURL?.absoluteString ?? "") } else if let error = ExportSession?.error { печать (ошибка) обработчик?("") } }) } func saveVideoToPhotoLibrary (videoURL: URL) { если #available(iOS 14, *) { PHPhotoLibrary.requestAuthorization(для: PHAccessLevel.readWrite) { _ в PHPhotoLibrary.shared().performChanges({ PHAssetChangeRequest.creationRequestForAssetFromVideo (atFileURL: videoURL) }, завершениеHandler: { успех, ошибка в если успех { self.outputPath = videoURL.absoluteString } иначе, если пусть ошибка = ошибка { print("Не удалось сохранить видео в библиотеку фотографий: \(error.localizedDescription)") } }) } } еще { // Откат к более ранним версиям } } func saveVideoToDocumentDirectory (videoURL: URL) -> URL? { пустойДиректорияДокумента() пусть fileManager = FileManager.default // Получаем URL-адрес каталога документов Guard let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { print("Каталог с документами не найден") вернуть ноль } // Устанавливаем целевой URL let targetURL = documentDirectory.appendingPathComponent("\(generateRandomString()).\(videoURL.pathExtension)") делать { // Если целевой файл уже существует, удалите его если fileManager.fileExists(atPath: DestinationURL.path) { попробуйте fileManager.removeItem(по адресу: URL назначения) } // Копируем видеофайл в каталог документа попробуйте fileManager.copyItem(по адресу: videoURL, по адресу: URL назначения) print("Видео сохранено в каталоге документов:", targetURL) URL назначения возврата } ловить { print("Ошибка сохранения видео:", error.localizedDescription) вернуть ноль } } func пустойDocumentDirectory() { пусть fileManager = FileManager.default пусть documentUrl = попробуй! fileManager.url(для: .documentDirectory, в: .userDomainMask, соответствующийFor: nil, create: false) делать { пусть содержимое = попробуйте fileManager.contentsOfDirectory(at: documentUrl, включаяPropertiesForKeys: ноль, параметры: []) для fileUrl в содержании { попробуйте fileManager.removeItem(at: fileUrl) } print("Каталог документов пуст.") } ловить { print("Ошибка очистки каталога документов: \(ошибка)") } } функция генерацииRandomString() -> Нить { let символы = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" вар случайная строка = "" // Получаем текущую временную метку пусть временная метка = Date().timeIntervalSince1970 пусть timestampInt = Int (метка времени) // Используем временную метку для заполнения генератора случайных чисел srand48 (метка времениInt) для _ в 0 ..< 10 { пусть randomIndex = Int(drand48() * Double(characters.count)) пусть символ = символы[characters.index(characters.startIndex, offsetBy: randomIndex)] СлучайнаяСтрока.append(символ) } вернуть случайную строку } func deleteFileFromDocumentDirectory (videoURL: URL) { // Получаем URL-адрес каталога документов Guard let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { возвращаться } делать { // Если целевой файл уже существует, удалите его если FileManager.default.fileExists(atPath: videoURL.path) { попробуйте FileManager.default.removeItem (по адресу: videoURL) } } ловить { Распечатать("") } } }
Я создал класс для выбора видео из галереи, файлового менеджера и камеры. Я хочу удалить информацию о местоположении GPS из видео и сохранить новое видео в галерее. В настоящее время я столкнулся с ошибкой ниже.
Невозможно сохранить Ошибка Domain=AVFoundationErrorDomain Code=-11823 «Невозможно сохранить» UserInfo={NSLocalizedRecoverySuggestion=Запрошенное имя файла уже используется. Попробуйте другое имя или местоположение файла., NSLocalizedDescription=Cannot Save, NSUderlyingError=0x600000d29860 {Error Domain=NSOSStatusErrorDomain Code=-12101 "(null)"}
Сначала я пытаюсь удалить метаданные, а затем сохранить измененное видео в галерее. Ниже приведены ключи списка:
NSPhotoLibraryUsageDescription NSPhotoLibraryAddUsageDescription Чтобы проверить функцию, просто позвоните.
VideoHandler1.shared.removeMetaData(filePath: videoPath) Класс:
публичный класс VideoHandler1: NSObject { общедоступный статический пусть общий = VideoHandler1() вар inputPath = "" вар выходной путь = "" общественная функция RemoveMetaData (filePath: String) { входной путь = путь к файлу Guard let newUrl = URL (строка: filePath) еще {возвращение} // Удаление метаданных и информации GPS RemoveMetadataAndGPSInfo(from: newUrl) { [слабое само] модифицированноеВидео в если let ModifiedVideoURL = URL (строка: ModifiedVideo) { // Сохраняем измененное видео в библиотеку фотографий self?.saveVideoToPhotoLibrary(videoURL:modifiedVideoURL) } } } } расширение VideoHandler1 { func RemoveMetadataAndGPSInfo(from videoURL: URL, обработчик: StringHandler?) { пусть актив = AVAsset (url: videoURL) let ExportSession = AVAssetExportSession (актив: актив, PresetName: AVAssetExportPresetPassthrough) пусть outputURL = saveVideoToDocumentDirectory (videoURL: videoURL) ExportSession?.outputURL = saveVideoToDocumentDirectory(videoURL: videoURL) // ExportSession?.outputFileType = AVFileType(rawValue: videoURL.pathExtension) ExportSession?.outputFileType = .mp4 // Удаление дорожек метаданных, содержащих информацию GPS ExportSession?.metadata = assets.metadata.filter {$0.key as! AVMetadataKey != AVMetadataKey.commonKeyLocation } ExportSession?.exportAsynchronous(completionHandler: { если ExportSession?.status == .completed { print("Метаданные и информация GPS успешно удалены.") обработчик?(outputURL?.absoluteString ?? "") } else if let error = ExportSession?.error { печать (ошибка) обработчик?("") } }) } func saveVideoToPhotoLibrary (videoURL: URL) { если #available(iOS 14, *) { PHPhotoLibrary.requestAuthorization(для: PHAccessLevel.readWrite) { _ в PHPhotoLibrary.shared().performChanges({ PHAssetChangeRequest.creationRequestForAssetFromVideo (atFileURL: videoURL) }, завершениеHandler: { успех, ошибка в если успех { self.outputPath = videoURL.absoluteString } иначе, если пусть ошибка = ошибка { print("Не удалось сохранить видео в библиотеку фотографий: \(error.localizedDescription)") } }) } } еще { // Откат к более ранним версиям } } func saveVideoToDocumentDirectory (videoURL: URL) -> URL? { пустойДиректорияДокумента() пусть fileManager = FileManager.default // Получаем URL-адрес каталога документов Guard let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { print("Каталог с документами не найден") вернуть ноль } // Устанавливаем целевой URL let targetURL = documentDirectory.appendingPathComponent("\(generateRandomString()).\(videoURL.pathExtension)") делать { // Если целевой файл уже существует, удалите его если fileManager.fileExists(atPath: DestinationURL.path) { попробуйте fileManager.removeItem(по адресу: URL назначения) } // Копируем видеофайл в каталог документа попробуйте fileManager.copyItem(по адресу: videoURL, по адресу: URL назначения) print("Видео сохранено в каталоге документов:", targetURL) URL назначения возврата } ловить { print("Ошибка сохранения видео:", error.localizedDescription) вернуть ноль } } func пустойDocumentDirectory() { пусть fileManager = FileManager.default пусть documentUrl = попробуй! fileManager.url(для: .documentDirectory, в: .userDomainMask, соответствующийFor: nil, create: false) делать { пусть содержимое = попробуйте fileManager.contentsOfDirectory(at: documentUrl, включаяPropertiesForKeys: ноль, параметры: []) для fileUrl в содержании { попробуйте fileManager.removeItem(at: fileUrl) } print("Каталог документов пуст.") } ловить { print("Ошибка очистки каталога документов: \(ошибка)") } } функция генерацииRandomString() -> Нить { let символы = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" вар случайная строка = "" // Получаем текущую временную метку пусть временная метка = Date().timeIntervalSince1970 пусть timestampInt = Int (метка времени) // Используем временную метку для заполнения генератора случайных чисел srand48 (метка времениInt) для _ в 0 ..< 10 { пусть randomIndex = Int(drand48() * Double(characters.count)) пусть символ = символы[characters.index(characters.startIndex, offsetBy: randomIndex)] СлучайнаяСтрока.append(символ) } вернуть случайную строку } func deleteFileFromDocumentDirectory (videoURL: URL) { // Получаем URL-адрес каталога документов Guard let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { возвращаться } делать { // Если целевой файл уже существует, удалите его если FileManager.default.fileExists(atPath: videoURL.path) { попробуйте FileManager.default.removeItem (по адресу: videoURL) } } ловить { Распечатать("") } } }
Мобильная версия