#image #video #avfoundation #avurlasset #cmtime
#изображение #Видео #avfoundation #avurlasset #cmtime
Вопрос:
Каждый раз, когда я пытаюсь сгенерировать неподвижный кадр из моего видеоресурса, он генерируется за время 0,000.. секунд. Я вижу это из своего сообщения в журнале. Хорошо, что я могу получить изображение за время 0.000 .., чтобы оно отображалось в UIImageView под названием «myImageView». Я думал, проблема в том, что не был установлен AVURLAssetPreferPreciseDurationAndTimingKey, но даже после того, как я выяснил, как это сделать, он все еще не функционирует..
Вот что у меня есть..
время, ActualTime и generate объявлены в заголовке
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/videoTest4.m4v"]];
//UISaveVideoAtPathToSavedPhotosAlbum(path, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
NSURL *url = [NSURL fileURLWithPath:path];
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:options];
Float64 durationSeconds = CMTimeGetSeconds([asset duration]);
generate = [[AVAssetImageGenerator alloc] initWithAsset:asset];
NSError *err = nil;
time = CMTimeMake(600,600.0);
CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:amp;actualTime error:amp;err];
UIImage *currentImg = [[UIImage alloc] initWithCGImage:imgRef];
myImageView.image = currentImg;
NSLog(@"The total Video Duration is %f",durationSeconds);
NSLog(@"The time I want my image is %f",CMTimeGetSeconds(time));
NSLog(@"The actual time my image was take was %f",CMTimeGetSeconds(actualTime));
И моя консоль читает..
2011-04-28 18:49:59.062 ВидеоТест [26553: 207] Общая продолжительность видео составляет 1,880000
2011-04-28 18:49: 59.064 ВидеоТест [26553: 207] Время, когда я хочу, чтобы мое изображение было 1.000000
2011-04-28 18:49: 59.064 ВидеоТест [26553: 207] Фактическое время съемки моего изображения составило 0,000000
……………………..
Заранее большое спасибо вам, ребята .. 🙂
Комментарии:
1. Я только что протестировал 6-секундный клип.. Когда я запрашиваю изображение через 2 секунды, я все равно получаю свое изображение через 0,00 .. когда я запрашиваю изображение через 4 секунды, я, наконец, получаю изображение через 5,003 секунды! Итак, мой код работает, мне просто нужно гораздо больше точности!!
Ответ №1:
Чтобы решить эту проблему, вам просто нужно установить requestedTimeToleranceBefore и requestedtimetoleranceater в kCMTimeZero для AVAssetImageGenerator.
Комментарии:
1. Это лучшее предложение, по крайней мере, на мой взгляд!
Ответ №2:
Вчера поздно вечером у меня появилась идея, и, конечно же, сегодня утром она сработала. По сути, я просто создаю новый ресурс композиции, а затем создаю временной диапазон, который представляет один кадр для видео со скоростью 24 кадра в секунду. Как только я создаю эти композиции, я просто беру первый кадр каждой композиции. Я делаю это для каждого кадра и создаю массив, содержащий все мои кадры. Вот что я сделал..
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/videoTest4.m4v"]];
//UISaveVideoAtPathToSavedPhotosAlbum(path, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
NSURL *url = [NSURL fileURLWithPath:path];
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:options];
Float64 durationFrames = CMTimeGetSeconds([asset duration]) * 24.0;
AVMutableComposition *myComp = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionVideoTrack = [myComp addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
NSError *error = nil;
BOOL ok = NO;
NSMutableArray* frameArray = [[NSMutableArray alloc] init];
generate = [[AVAssetImageGenerator alloc] initWithAsset:myComp];
NSError *err = nil;
for (int i = 0; i < floor(durationFrames); i ) {
CMTime startTime = CMTimeMake(i, 24);
CMTime endTime = CMTimeMake(i 1, 24);
CMTimeRange myRange = CMTimeRangeMake(startTime, endTime);
AVAssetTrack *sourceVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
ok = [compositionVideoTrack insertTimeRange:myRange ofTrack:sourceVideoTrack atTime:kCMTimeZero error:amp;error];
if (!ok) {
// Deal with the error.
}
time = CMTimeMake(0,1);
CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:amp;actualTime error:amp;err];
UIImage *currentImg = [[UIImage alloc] initWithCGImage:imgRef];
[frameArray addObject:currentImg];
[currentImg release];
}
NSLog(@"This video is calculated at %f Frames..",durationFrames);
NSLog(@"You made a total of %i Frames!!",[frameArray count]);
Затем консоль считывает..
2011-04-29 10:42:24.292 ВидеоТест [29019: 207] Это видео рассчитано на 45.120000 кадров..
2011-04-29 10:42:24.293 ВидеоТест[29019:207] Вы сделали в общей сложности 45 кадров!!