Я хочу обрезать видеофайл. Я хочу просто выбрать видео из галереи и преобразовать его в 15-секундное видео. Если я использую обычную обрезку с контроллером представления выбора, он не указывает время и просто показывает кадры, но мне нужно зафиксировать на 15 секунд. Как я могу этого добиться?
Как обрезать видеофайл и преобразовать его в 15-секундное видео с помощью iOS SDK?
Ответы (2)
Цель-C
-(void)cropVideo:(NSURL*)videoToTrimURL{
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoToTrimURL options:nil];
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *outputURL = paths[0];
NSFileManager *manager = [NSFileManager defaultManager];
[manager createDirectoryAtPath:outputURL withIntermediateDirectories:YES attributes:nil error:nil];
outputURL = [outputURL stringByAppendingPathComponent:@"output.mp4"];
// Remove Existing File
[manager removeItemAtPath:outputURL error:nil];
exportSession.outputURL = [NSURL fileURLWithPath:outputURL];
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
CMTime start = CMTimeMakeWithSeconds(1.0, 600); // you will modify time range here
CMTime duration = CMTimeMakeWithSeconds(15.0, 600);
CMTimeRange range = CMTimeRangeMake(start, duration);
exportSession.timeRange = range;
[exportSession exportAsynchronouslyWithCompletionHandler:^(void)
{
switch (exportSession.status) {
case AVAssetExportSessionStatusCompleted:
[self writeVideoToPhotoLibrary:[NSURL fileURLWithPath:outputURL]];
NSLog(@"Export Complete %d %@", exportSession.status, exportSession.error);
break;
case AVAssetExportSessionStatusFailed:
NSLog(@"Failed:%@",exportSession.error);
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"Canceled:%@",exportSession.error);
break;
default:
break;
}
//[exportSession release];
}];
}
В Swift 4.0
static func cropVideo(atURL url:URL) {
let asset = AVURLAsset(url: url)
let exportSession = AVAssetExportSession.init(asset: asset, presetName: AVAssetExportPresetHighestQuality)!
var outputURL = URL(string:NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!)
let fileManager = FileManager.default
do {
try fileManager.createDirectory(at: outputURL!, withIntermediateDirectories: true, attributes: nil)
} catch {
}
outputURL?.appendPathComponent("output.mp4")
// Remove existing file
do {
try fileManager.removeItem(at: outputURL!)
}
catch {
}
exportSession.outputURL = outputURL
exportSession.shouldOptimizeForNetworkUse = true
exportSession.outputFileType = AVFileTypeQuickTimeMovie
let start = CMTimeMakeWithSeconds(1.0, 600) // you will modify time range here
let duration = CMTimeMakeWithSeconds(15.0, 600)
let range = CMTimeRangeMake(start, duration)
exportSession.timeRange = range
exportSession.exportAsynchronously {
switch(exportSession.status) {
case .completed: break
//
case .failed: break
//
case .cancelled: break
//
default: break
}
}
}
person
ram
schedule
27.11.2013
Если мы изменяем время начала и продолжительность, иногда видео не обрезается правильно. Не могли бы вы проверить это.
- person Imran; 16.01.2014
@ram продолжительность моего видео 60 секунд, я хочу удалить от 15 до 30 секунд
- person sohil; 10.08.2017
Начало CMTime = CMTimeMakeWithSeconds(15, 600); // вы измените CMTime duration = CMTimeMakeWithSeconds(30, 600); @sohil это сработает для тебя
- person ram; 10.08.2017
@ram Я снова сказал тебе, что не хочу обрезать видео с самого начала, как ты сказал, но на самом деле я хочу обрезать видео с 15 до 30 секунд (Примечание: не обрезать с начала).
- person sohil; 10.08.2017
@ram, я использую этот код, но после обрезки видео пропало аудио, может дать мне какое-либо предложение, как обрезать видео без пропадания звука.
- person pansora abhay; 16.03.2019
Приведенный выше ответ сработал для меня с небольшим изменением на случай, если нам нужно установить время начала и время окончания для обрезки.
Я изменил это:
CMTime start = CMTimeMakeWithSeconds(1.0, 600); // you will modify time range here
CMTime duration = CMTimeMakeWithSeconds(15.0, 600);
CMTimeRange range = CMTimeRangeMake(start, duration);
К этому:
CMTime start = CMTimeMakeWithSeconds(self.StartTime, 600); // you will modify time range here
CMTime duration = CMTimeSubtract(CMTimeMakeWithSeconds(self.EndTime, 600), start);
CMTimeRange range = CMTimeRangeMake(start, duration);
Это сработало для меня.
person
Imran
schedule
16.01.2014
продолжительность моего видео 60 секунд, я хочу удалить от 15 до 30 секунд
- person sohil; 10.08.2017
Начало CMTime = CMTimeMakeWithSeconds(15, 600); // вы измените CMTime duration = CMTimeMakeWithSeconds(30, 600); @sohil это сработает для тебя
- person ram; 10.08.2017