Обновлен пример кода, вывод консоли и информация
Я пытаюсь получить общую продолжительность видеокомпозиции, разделить ее на 10, округлить, затем прокрутить и соединить видеокомпозицию с этими интервалами.
Это работает, но после того, как «currentDuration» становится 60+, он выдает «Запрошенный URL-адрес не найден на этом сервере».
По сути, если он определяет, что ему нужно создать 9 клипов, он преуспевает в первых 6 и терпит неудачу в остальных 3. Также мой numLoop не работает должным образом, кажется, что цикл while заканчивается до того, как будет предпринята попытка любого из 9 клипов.
Были бы рады получить помощь или советы по экспорту всех 9 клипов.
Я заметил, что если видео длится менее 60 секунд, оно имеет 100% -ный успех. Любое видео, которое я выберу более 60 секунд, не будет работать на 7-м клипе.
Вот мой метод:
func splitVideo(videoComposition: AVMutableVideoComposition) {
let fileManager = NSFileManager.defaultManager()
let documentsPath : String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true)[0]
//grab total duration/number of splits
let exporter: AVAssetExportSession = AVAssetExportSession(asset: asset!, presetName:AVAssetExportPresetHighestQuality)!
let totalDuration = Float64(CMTimeGetSeconds(exporter.asset.duration))
let totalDurationPieces = (totalDuration/10)
var numberOfSplits=Int(ceil(Double(totalDurationPieces)))
//prepare for loop
var loopNum : Int = 0
var currentDuration : Float64 = 0
var sessionNumber = (arc4random()%1000)
let opQueue = NSOperationQueue()
opQueue.maxConcurrentOperationCount = 1
while loopNum < numberOfSplits {
//new exporter
var destinationPath: String = documentsPath + "/splitVideo-"+String(sessionNumber)
destinationPath+="-"+String(Int(loopNum))+".mp4"
let new_exporter = AVAssetExportSession(asset: asset!, presetName:AVAssetExportPresetHighestQuality)!
new_exporter.outputURL = NSURL(fileURLWithPath: destinationPath as String)
new_exporter.videoComposition = videoComposition
new_exporter.outputFileType = AVFileTypeMPEG4
new_exporter.shouldOptimizeForNetworkUse = false
new_exporter.timeRange = CMTimeRangeMake(
CMTimeMakeWithSeconds(currentDuration, framesPerSecond!),CMTimeMakeWithSeconds(Float64(10),framesPerSecond!))
// Set up the exporter, then:
opQueue.addOperationWithBlock { () -> Void in
new_exporter.exportAsynchronouslyWithCompletionHandler({
dispatch_async(dispatch_get_main_queue(),{
print("Exporting... \(loopNum)")
self.exportDidFinish(new_exporter, loopNum: loopNum)
})
}) // end completion handler
} // end block
//prepare for next loop
loopNum = loopNum+1
currentDuration = currentDuration+10
if(loopNum>=numberOfSplits){
self.allExportsDone(Int(numberOfSplits))
}
} // end while
}
Вот метод exportDidFinish:
func exportDidFinish(session: AVAssetExportSession, loopNum: Int) {
let outputURL: NSURL = session.outputURL!
let library: ALAssetsLibrary = ALAssetsLibrary()
if(library.videoAtPathIsCompatibleWithSavedPhotosAlbum(outputURL)) {
library.writeVideoAtPathToSavedPhotosAlbum(outputURL, completionBlock: {(url, error) in
//done
print("Success on \(Int(loopNum))")
})
}
}
Вот вывод консоли:
Exporting... 9
2016-08-20 13:39:27.980 TrimVideo[4776:1576022] Video /var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-6.mp4 cannot be saved to the saved photos album: Error Domain=NSURLErrorDomain Code=-1100 "The requested URL was not found on this server." UserInfo={NSUnderlyingError=0x1457f43f0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}, NSErrorFailingURLStringKey=file:///var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-6.mp4, NSErrorFailingURLKey=file:///var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-6.mp4, NSURL=file:///var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-6.mp4, NSLocalizedDescription=The requested URL was not found on this server.}
Exporting... 9
2016-08-20 13:39:27.984 TrimVideo[4776:1576022] Video /var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-7.mp4 cannot be saved to the saved photos album: Error Domain=NSURLErrorDomain Code=-1100 "The requested URL was not found on this server." UserInfo={NSUnderlyingError=0x1457f88c0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}, NSErrorFailingURLStringKey=file:///var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-7.mp4, NSErrorFailingURLKey=file:///var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-7.mp4, NSURL=file:///var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-7.mp4, NSLocalizedDescription=The requested URL was not found on this server.}
Exporting... 9
2016-08-20 13:39:27.988 TrimVideo[4776:1576022] Video /var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-8.mp4 cannot be saved to the saved photos album: Error Domain=NSURLErrorDomain Code=-1100 "The requested URL was not found on this server." UserInfo={NSUnderlyingError=0x14687cb30 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}, NSErrorFailingURLStringKey=file:///var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-8.mp4, NSErrorFailingURLKey=file:///var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-8.mp4, NSURL=file:///var/mobile/Containers/Data/Application/BE125EB7-AFC4-48B5-95C3-941B420BB71F/Documents/splitVideo-972-8.mp4, NSLocalizedDescription=The requested URL was not found on this server.}
Exporting... 9
Success on 9
Exporting... 9
Success on 9
Exporting... 9
Success on 9
Exporting... 9
Success on 9
Exporting... 9