2016-05-25 2 views
2

Я пытаюсь использовать AVAssetExportSession на видео, выбранного в расширении доли и получениеAVAssetExportSession в расширении доли

Error Domain = NSURLErrorDomain Код = -3000 «Невозможно создать файл» UserInfo = {NSLocalizedDescription = Невозможно создать файл , NSUnderlyingError = 0x14811fdb0 {Error Domain = NSOSStatusErrorDomain Code = -12124 "(нуль)"}}

Но я могу создать файл вручную в то же NSURL без ошибок. Вот функция, я использую

func reencodeVideo() { 
    let videoAsset = AVURLAsset(URL: video.url) 

    let videoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0] as AVAssetTrack 
    print(videoTrack.estimatedDataRate) 
    let exportSession = AVAssetExportSession(asset: videoAsset, presetName: AVAssetExportPreset1920x1080) 
    guard let outputURL = uploadableFileURL else { 
     return 
    } 
    let fileManager = NSFileManager.defaultManager() 
    // let created = fileManager.createFileAtPath(outputURL.path!, contents: nil, attributes: nil) 
    if let path = outputURL.path where fileManager.fileExistsAtPath(path) { 
     print("file exists") 
    } 
    do { 
     try fileManager.removeItemAtURL(outputURL) 
     print("deleted") 
    } catch { 
     print(error) 
    } 
    exportSession?.outputURL = outputURL 
    exportSession?.outputFileType = AVFileTypeQuickTimeMovie 

    exportSession?.exportAsynchronouslyWithCompletionHandler{ 
     print(exportSession?.status) 
    } 
} 

private var uploadableFileURL: NSURL? { 
    guard let tempFileName = video.url.lastPathComponent else { 
     return nil 
    } 
    let fileManager = NSFileManager.defaultManager() 
    guard let containerURL = fileManager.containerURLForSecurityApplicationGroupIdentifier(Constants.appGroupIdentifier) else { 
     return nil 
    } 
    return containerURL.URLByAppendingPathComponent("videoFile.mov") 
} 

Я успешно созданный файл в том же каталоге, но AVAssetExportSession возвращает ошибку там. Любые идеи, что я делаю неправильно?

Я пробовал использовать AVAssetReader и AVAssetWriter, а AVAssetWriter возвращает ту же ошибку при попытке запустить. Процесс кодирования завершается успешно, если я использую папку «Документы» и не работает только при использовании контейнера общей группы приложений.

ответ

2

Ты проблема может быть связана с использованием документа папки и ICloud синхронизации , См https://forums.developer.apple.com/message/77495#77495

Если вы что-то вроде:

guard let containerURL = fileManager.containerURLForSecurityApplicationGroupIdentifier(Constants.appGroupIdentifier) else { 
     return nil 
} 

let libraryURL = containerURL.URLByAppendingPathComponent("Library", isDirectory: true) 
let cachesURL = libraryURL.URLByAppendingPathComponent("Caches", isDirectory: true) 
return cachesURL.URLByAppendingPathComponent("videoFile.mov") 
+1

Это помогло, спасибо – Ruslan

-1

Я не могу понять из вашего кода, где ваш uploadableFileURL приходит от, но следующие работы для меня:

if let video = videoAsset { 

    let fm = NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask) 
    let url = fm[0].URLByAppendingPathComponent("\(NSDate())").URLByAppendingPathExtension("mp4") 

    let exporter = AVAssetExportSession(asset: video, presetName: AVAssetExportPreset3840x2160) 
    exporter?.outputURL = url 
    exporter?.outputFileType = AVFileTypeMPEG4 
    exporter?.exportAsynchronouslyWithCompletionHandler() { _ in 
    let data = NSData(contentsOfURL: url) 
    } 
} 
+0

Криса, я устанавливаю uploadableFileURL к приложению групповой контейнеру (общий каталог между приложениями в приложении Group, или в моем случае это делило между приложением и расширение доли). Мне нужно использовать контейнер группы приложений, поскольку расширение общего доступа не имеет доступа к другим каталогам (например, к документам или кэш-памяти). Когда я использую документы или каталог Cashes для экспорта, он работает, но не для папки группы приложений, хотя я могу использовать тот же uploadableFileURL для создания файла вручную без ошибки. – Ruslan

+0

Хм, а URL, который вы используете, «пуст», так сказать? То есть это вновь созданный уникальный URL-адрес? – Chris

+0

Да, я проверяю его на наличие файла и удаляю его, и я также пытался использовать уникальное имя, поэтому я уверен, что этот файл не существует до – Ruslan

Смежные вопросы