Ошибка при попытке получить размер (КБ) видеофайла - PullRequest
0 голосов
/ 03 сентября 2018

В моем приложении показаны все видео с фотографиями. Когда видео выбрано, оно воспроизводится с помощью avplayer. Но когда я попытался получить размер (КБ) выбранного видеофайла, он показывает ошибку. При попытке скопировать видеофайл возникла та же ошибка.

Я взял эти разрешения:

<key>NSCameraUsageDescription</key>
<string>App needs to access camera</string>
<key>NSMicrophoneUsageDescription</key>
<string>App need to access microphone</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App needs to access photos and videos</string>

Код для получения размера:

func fileSize(forURL url: Any) -> Double {

    var fileURL: URL?
    var fileSize: Double = 0.0

    if url is URL || url is String {

        if url is URL {
            fileURL = url as? URL
        }
        else {
            fileURL = URL(fileURLWithPath: url as! String)
        }
        var fileSizeValue = 0.0

        do{
            try fileSizeValue = (fileURL?.resourceValues(forKeys: [URLResourceKey.fileSizeKey]).allValues.first?.value as! Double?)!
            if fileSizeValue > 0.0 {
                fileSize = (Double(fileSizeValue) / (1024 * 1024))
            }

        } catch {

            print("file size error: \(error)")
        }
    }
    return fileSize
}

let fileSize = fileSize(forURL: selectedVideos[0] as Any)

URL видеофайла:"file: ///var/mobile/Media/DCIM/107APPLE/IMG_7728.MOV"

Ошибка: Ошибка домена = NSCocoaErrorDomain Code = 257 "Файл« IMG_7728.MOV »не может быть открыт, поскольку у вас нет разрешения на посмотри ". UserInfo = {NSURL = Файл: ///var/mobile/Media/DCIM/107APPLE/IMG_7728.MOV, NSFilePath = / вар / мобильного / СМИ / DCIM / 107APPLE / IMG_7728.MOV, NSUnderlyingError = 0x1c445ef90 {Ошибка домена = NSPOSIXErrorDomain Code = 1 «Операция не разрешена»}}

Edit: Я изменил URL для пути. Но все равно показывает ошибку:

   let selectedFilePath = (selectedVideos[0] as! URL).path
    print("video path: \(selectedFilePath)")
    do{
        let attributes = try FileManager.default.attributesOfItem(atPath: selectedFilePath)
        let fileSize = attributes[.size] as! NSNumber
        print("file size: \(fileSize)")
    } catch {  
        print("file size error: \(error)")
    }

    let filePath = get_directory().appendingPathComponent("video\(CACurrentMediaTime()).MOV")
    print("copy to path: \(filePath.path)")
    do {
        try FileManager.default.copyItem(atPath: selectedFilePath, toPath: filePath.path)

    } catch {

        print("copy error: \(error)")
    }

Ошибка:

путь к видео: /var/mobile/Media/DCIM/107APPLE/IMG_7789.MOV

ошибка размера файла: Ошибка Domain = NSCocoaErrorDomain Code = 257 «Файл« IMG_7789.MOV »не может быть открыт, поскольку у вас нет разрешения на его просмотр». UserInfo = {NSFilePath = / var / mobile / Media / DCIM / 107APPLE / IMG_7789.MOV, NSUnderlyingError = 0x1c0259530 {Ошибка домена = NSPOSIXErrorDomain Code = 1 «Операция не разрешена»}}

скопировать в путь: /var/mobile/Containers/Data/Application/5AAD29BD-489D-4737-AA98-E6131EFBA94D/Documents/addMusicToVideos/voices/video1171047.69338271.MOV

ошибка копирования: Ошибка Domain = NSCocoaErrorDomain Code = 257 «Файл« IMG_7789.MOV »не может быть открыт, потому что у вас нет разрешения на его просмотр». UserInfo = {NSFilePath = / var / mobile / Media / DCIM / 107APPLE / IMG_7789.MOV, NSUnderlyingError = 0x1c4859830 {Ошибка домена = NSPOSIXErrorDomain Code = 1 «Операция не разрешена»}}

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете очень легко получить размер видеофайла по URL, используя это расширение AVURLAsset . Обязательно импортируйте AVFoundation framework. Код указан ниже:

extension AVURLAsset {
    var fileSize: Int? {
    let keys: Set<URLResourceKey> = [.totalFileSizeKey, .fileSizeKey]
    let resourceValues = try? url.resourceValues(forKeys: keys)

    return resourceValues?.fileSize ?? resourceValues?.totalFileSize
    }
} 

Это расширение возвращает размер видео в Int (байты). Вы можете изменить единицы, как вам нужно. Чтобы назвать это, используйте этот подход:

let asset = AVURLAsset(url: urlOfYourAsset)
print(asset.fileSize ?? 0)

Вы не предоставили достаточно информации. Проблема в вашей файловой системе. Проблема в том, где вы размещаете видеофайлы в iOS и как вы получаете URL. Может быть, это ваш URL, который не разрешен в песочнице. Пожалуйста, изучите дальше и прочитайте Документация Apple .

...