2017-02-22 14 views
0

Я построил строку, которая представляет собой путь к каталогу и имя файла файла, который я хотел бы воспроизвести в AVPlayer. Но я изо всех сил пытаюсь преобразовать это в URL.Проблема с получением URL-адреса из String для использования с AVPlayer

let dataPath = ("\(packDirectory)/").appending((cachedFilePath as NSString).lastPathComponent) 
print(dataPath) 
audioFileURL = dataPath 
self.audioPlayerItem = AVPlayerItem(url: NSURL.fileURL(withPath: audioFileURL) as URL) 
print(self.audioPlayerItem) 

печати (DATAPATH) возвращает:

/Users/Geoff/Library/Developer/CoreSimulator/Devices/A31BF8F8-21F6-4227-97B6-9DBDED26CA3E/data/Containers/Data/Application/788085B9-242E-46E7-9644-6A3BF9D515DB/Documents/Next-pk000/7b54d8a0f1a64b710058d4408ca4d696_The%20Name%20of%20the%20Wind%2029-92.mp3 

печати (self.audioPlayerItem) возвращает: - URL часть:

URL = file:///Users/Geoff/Library/Developer/CoreSimulator/Devices/A31BF8F8-21F6-4227-97B6-9DBDED26CA3E/data/Containers/Data/Application/788085B9-242E-46E7-9644-6A3BF9D515DB/Documents/Next-pk000/7b54d8a0f1a64b710058d4408ca4d696_The%2520Name%2520of%2520the%2520Wind%252029-92.mp3 

Я не очень понимаю эти вещи, но я может видеть 2 проблемы с этим.

1) file: //: Я намеренно удалил это из своей «dataPath», так как при использовании диспетчера файлов он не мог найти что-либо с этим префиксом. Я использовал этот код для этого:

userDirectory.removeSubrange(userDirectory.startIndex..<userDirectory.index(userDirectory.startIndex, offsetBy: 7)) 
let packDirectory = userDirectory.appending("Next-\(self.selectedPack!)") 

2) кодирование в .lastComponent было изменено с% 20% до 2520

Очень путать!

---- EDIT ----

let urlItem = AVPlayerItem(url: URL(fileURLWithPath: audioFileURL)) 
if let urlAsset = urlItem.asset as? AVURLAsset { 
    self.audioPlayerItem = AVPlayerItem(url: NSURL(string: urlAsset.url.path) as! URL) 
    print(urlAsset.url.path) 
} 
print(self.audioPlayerItem!) 

печати (urlAsset.url.path) возвращает:

/Users/Geoff/Library/Developer/CoreSimulator/Devices/A31BF8F8-21F6-4227-97B6-9DBDED26CA3E/data/Containers/Data/Application/BAD0194A-8CDD-44CE-BF99-B9FF35E23BCA/Documents/Next-pk000/7b54d8a0f1a64b710058d4408ca4d696_The%20Name%20of%20the%20Wind%2029-92.mp3 

печати (self.audioPlayerItem!) Возвращает:

<AVPlayerItem: 0x7bf81b60, asset = <AVURLAsset: 0x7bf87c70, URL = /Users/Geoff/Library/Developer/CoreSimulator/Devices/A31BF8F8-21F6-4227-97B6-9DBDED26CA3E/data/Containers/Data/Applicati ... 9-92.mp3>> 

self.audioPlayerItem = AVPlayerItem(url: URL(fileURLWithPath: urlAsset.url.path)) 

отпечатки:

file:///Users/Geoff/Library/Developer/CoreSimulator/Devices/A31BF8F8-21F6-4227-97B6-9DBDED26CA3E/data/Containers/Data/Application/7C212656-8E1C-44C8-9951-4444FB5EF853/Documents/Next-pk000/7b54d8a0f1a64b710058d4408ca4d696_The%2520Name%2520of%2520the%2520Wind%252029-92.mp3 

даже используя что-то вроде:

let asset = AVAsset(url: URL(string: urlAsset.url.path)!) as AVAsset 

приводит к потере некоторых из URL:

<AVPlayerItem: 0x79716ed0, asset = <AVURLAsset: 0x797185d0, URL = /Users/Geoff/Library/Developer/CoreSimulator/Devices/A31BF8F8-21F6-4227-97B6-9DBDED26CA3E/data/Containers/Data/Applicati ... 9-92.mp3>> 

И ничего не играет. Так что в основном я думаю, что он не будет играть с файлом: // префикс, но когда я подключу строку без него, что-то сокращает путь в i в приложениях ???

+0

Проверьте мой отредактированный ответ. – nynohu

ответ

1
  1. Вы можете прочитать о absoluteString и path из URL documentation. Для получения self.audioPlayerItem's URL с недостающими из file:/// вы можете получить доступ к активу self.audioPlayerItem и получить путь asset.url

    let asset = self.audioPlayerItem?.currentItem?.asset 
    if asset == nil { 
        return nil 
    } 
    if let urlAsset = asset as? AVURLAsset { 
        return urlAsset.url.path 
    } 
    

Edited: если вы используете локальный файл, инициализации URL с URL.init(fileURLWithPath:) вместо URL.init(string:). Если вы используете URL.init(string:), строка будет полным путем (содержит file:///), а не путь.

  1. Это нормально, результат декодирования тот же.Попробуйте прочитать присвоенный A html space is showing as %2520 instead of %20

P/S: что фрагмент кода просто псевдо, пожалуйста, следуйте идею из этого фрагмента кода.

+0

URL.init (fileURLWithPath:) возвращает файл: /// Пользователи ..... URL.init (строка:) возвращает/Users/.. и отключается в части приложения, как указано в вопросе ... я озадачен , – WanderingScouse

+0

- файл: // проблема? это кажется достаточно распространенным. Я просто знаю, что файловый менеджер не может найти файлы с ним. так почему это так? с какой целью? – WanderingScouse