Я пытаюсь обрезать локальный MP3-файл, выбранный пользователем ранее, чтобы получить 18-секундный фрагмент. Этот фрагмент должен быть экспортирован во временный путь к файлу. Это мой код:
guard songUrl.startAccessingSecurityScopedResource() else {
print("failed to access path")
return
}
// Make sure you release the security-scoped resource when you are done.
defer { songUrl.stopAccessingSecurityScopedResource() }
// Use file coordination for reading and writing any of the URL’s content.
var error: NSError? = nil
NSFileCoordinator().coordinate(readingItemAt: songUrl, error: &error) { (url) in
// Set temporary file path
let temporaryDirectoryUrl: URL = FileManager.default.temporaryDirectory
let temporaryDirectoryString: String = temporaryDirectoryUrl.absoluteString
let temporaryFilename = ProcessInfo().globallyUniqueString + ".m4a"
let temporaryFilepath = URL(string: (temporaryDirectoryString + temporaryFilename))!
// shorten audio file
let originalAsset = AVAsset(url: (url))
if let exporter = AVAssetExportSession(asset: originalAsset, presetName: AVAssetExportPresetAppleM4A) {
exporter.outputFileType = AVFileType.m4a
exporter.outputURL = temporaryFilepath
let originalDuration = Int64(CMTimeGetSeconds(originalAsset.duration))
let halftime: Int64 = (originalDuration/2)
let startTime = CMTimeMake(value: (halftime-9), timescale: 1)
let stopTime = CMTimeMake(value: (halftime+9), timescale: 1)
exporter.timeRange = CMTimeRangeFromTimeToTime(start: startTime, end: stopTime)
print(CMTimeGetSeconds(startTime), CMTimeGetSeconds(stopTime))
//Export audio snippet
exporter.exportAsynchronously(completionHandler: {
print("export complete \(exporter.status)")
switch exporter.status {
case AVAssetExportSessionStatus.failed:
if let e = exporter.error {
print("export failed \(e)")
}
case AVAssetExportSessionStatus.cancelled:
print("export cancelled \(String(describing: exporter.error))")
default:
print("export complete")
self.shortenedExported(temporaryFilePath: temporaryFilepath)
}
})
}
else {
print("cannot create AVAssetExportSession for asset \(originalAsset)")
}
}
Он печатает следующее:
экспорт завершен AVAssetExportSessionStatus
экспорт не выполнен Ошибка Domain = AVFoundationErrorDomain Code = -11800 "Операция не удалось завершить "UserInfo = {NSLocalizedFailureReason = Произошла неизвестная ошибка (-17508), NSLocalizedDescription = Операция не может быть завершена, NSUnderlyingError = 0x282368b40 {Ошибка домена = NSOSStatusErrorDomain Code = -17508" (null) "}}
Я не получаю сообщение об ошибке, когда использую MP3-файл из ресурсов моего пакета, используя Bundle.main.url(forResource: "sample_song", withExtension: "mp3")
вместо URL Координатора
Заранее спасибо!