iphone SDK> 3.0. Миниатюра видео? - PullRequest
       22

iphone SDK> 3.0. Миниатюра видео?

8 голосов
/ 11 августа 2009

Из того, что я прочитал, яблоко не раскрывает API, чтобы позволить разработчикам получить эскиз фильма, используя текущий SDK.

Может ли кто-нибудь поделиться некоторым кодом относительно того, как они идут по этому поводу? Я слышал, что вы можете получить доступ к представлению выбора камеры и найти представление изображения непосредственно перед закрытием окна выбора пользовательского интерфейса. Это выглядит некрасиво.

Также я рассмотрел возможность использования ffmpeg для извлечения кадра из фильма, но не имел бы понятия о том, как скомпилировать его как библиотеку для iphone. Любые указатели будут с благодарностью

Ответы [ 7 ]

10 голосов
/ 17 сентября 2009

Надеюсь, мой код может помочь вам, ребята. Это ужасно. Я думаю, что Apple должен открыть этот вид API. Конечно, все NSLog () должны быть удалены. Это просто для демонстрации.

Элвин

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
 // e.g.
 NSString *tempFilePath = [(NSURL *)[info valueForKey:UIImagePickerControllerMediaURL] absoluteString];
 NSLog(@"didFinishPickingMediaWithInfo: %@",tempFilePath);
 // e.g. /private/var/mobile/Applications/D1E784A4-EC1A-402B-81BF-F36D3A08A332/tmp/capture/capturedvideo.MOV
 tempFilePath = [[tempFilePath substringFromIndex:16] retain];
 NSLog(@"didFinishPickingMediaWithInfo: %@",tempFilePath);
 NSLog(@"===Try to save video to camera roll.===");
 NSLog(@"UIVideoAtPathIsCompatibleWithSavedPhotosAlbum: %@",UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(tempFilePath)? @"YES":@"NO");
 // Check if the video file can be saved to camera roll.
    if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(tempFilePath)){
  // YES. Copy it to the camera roll.
  UISaveVideoAtPathToSavedPhotosAlbum(tempFilePath, self, @selector(video:didFinishSavingWithError:contextInfo:), tempFilePath);
 }

 [self dismissModalViewControllerAnimated:YES];
}

- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(NSString *)contextInfo{
 NSLog(@"didFinishSavingWithError--videoPath in camera roll:%@",videoPath);
 NSLog(@"didFinishSavingWithError--videoPath in temp directory:%@",contextInfo);
 // The thumbnail jpg should located in this directory.
 NSString *thumbnailDirectory = [[contextInfo stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];

 // Debug info. list all files in the directory of the video file.
 // e.g. /private/var/mobile/Applications/D1E784A4-EC1A-402B-81BF-F36D3A08A332/tmp/capture
 NSLog([contextInfo stringByDeletingLastPathComponent]);
 NSLog([[[NSFileManager defaultManager] contentsOfDirectoryAtPath:[contextInfo stringByDeletingLastPathComponent] error:nil] description]);
 // Debug info. list all files in the parent directory of the video file, i.e. the "~/tmp" directory.
 // e.g. /private/var/mobile/Applications/D1E784A4-EC1A-402B-81BF-F36D3A08A332/tmp
 NSLog(thumbnailDirectory);
 NSLog([[[NSFileManager defaultManager] contentsOfDirectoryAtPath:thumbnailDirectory error:nil] description]);
 ///////////////////

 // Find the thumbnail for the video just recorded.
 NSString *file,*latestFile;
 NSDate *latestDate = [NSDate distantPast];
 NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:[[contextInfo stringByDeletingLastPathComponent]stringByDeletingLastPathComponent]];
 // Enumerate all files in the ~/tmp directory
 while (file = [dirEnum nextObject]) {
  // Only check files with jpg extension.
  if ([[file pathExtension] isEqualToString: @"jpg"]) {
   NSLog(@"***latestDate:%@",latestDate);
   NSLog(@"***file name:%@",file);
   NSLog(@"***NSFileSize:%@", [[dirEnum fileAttributes] valueForKey:@"NSFileSize"]);
   NSLog(@"***NSFileModificationDate:%@", [[dirEnum fileAttributes] valueForKey:@"NSFileModificationDate"]);
   // Check if current jpg file is the latest one.
   if ([(NSDate *)[[dirEnum fileAttributes] valueForKey:@"NSFileModificationDate"] compare:latestDate] == NSOrderedDescending){
    latestDate = [[dirEnum fileAttributes] valueForKey:@"NSFileModificationDate"];
    latestFile = file;
    NSLog(@"***latestFile changed:%@",latestFile);
   }
  }
 }
 // The thumbnail path.
 latestFile = [NSTemporaryDirectory() stringByAppendingPathComponent:latestFile];
 NSLog(@"****** The thumbnail file should be this one:%@",latestFile);

 // Your code ...
 // Your code ...
 // Your code ...
}
8 голосов
/ 19 августа 2009

jpg находится в той же папке, что и миниатюра фильма. Я только протестировал его с видео, записанным с телефона, но работает нормально. Он не называется так же, как фильм, поэтому получите путь к каталогу, в котором находится фильм, итерируйте для .jpg, и все готово.

5 голосов
/ 22 ноября 2011
NSString *videoLink=[info objectForKey:@"UIImagePickerControllerMediaURL"];

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:(NSURL*)videoLink];
UIImage *imageSel = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
[player stop];
[player release];
5 голосов
/ 25 августа 2010

Лучший метод, который я нашел ... MPMoviePlayerController thumbnailImageAtTime: timeOption

2 голосов
/ 10 февраля 2010

Вот запись в блоге о извлечении кадров из фильмов с использованием ffmpeg:

http://www.codza.com/extracting-frames-from-movies-on-iphone

Соответствующий проект на github: iFrameExtractor

1 голос
/ 24 сентября 2009

Просто хотел предоставить обновление по этому вопросу. Кажется, что все работает с точки зрения получения миниатюры, когда вы установили в своем средстве выбора UIImagePickerControllerSourceTypeCamera. Однако, когда вы пытаетесь выбрать из существующей библиотеки (то есть UIImagePickerControllerSourceTypePhotoLibrary) .jpg для миниатюры никогда не создается. Я даже попытался повторно сохранить с UISaveVideoAtPathToSavedPhotosAlbum (...) и до сих пор не играли в кости. Кажется, что миниатюра впервые создается при захвате видео. Это ваша единственная возможность «схватить» это. После этого он перемещается в подкаталог / var / mobile / Media / DCIM /. Хотя вы можете перечислить миниатюру изображения и увидеть, что это там, этот файл не читается и не может быть скопирован, так как я считаю, что каталог защищен.

Если у кого-то есть обходной путь для этого, я был бы очень признателен, так как в моем случае мне нужно взять эскиз существующего видео после выбора его из библиотеки.

0 голосов
/ 21 августа 2009

Если вы используете UIImagePickerController для получения изображения, то JPG не будет храниться в каталоге tmp. Я не уверен в ответе на этот вопрос, но ffmpeg, точнее, библиотеки, стоящие за ним, может быть вашим выбором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...