Я не могу получить точное CMTime для генерации неподвижного изображения из 1,8-секундного видео

#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.

Ссылка на класс 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 кадров!!