2009-08-11 3 views
8

Из того, что я прочитал, яблоко не раскрывает api, чтобы позволить разработчикам получить миниатюру фильма с использованием текущего sdk.iphone sdk> 3.0. Видео миниатюры?

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

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

ответ

8

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

+0

im will give this the blast and the let you thanks thanks – ADAM

+1

Дайте мне знать, как это получилось. Я могу опубликовать код, который сделает это для вас, если у вас возникнут проблемы. Просто реализовано это в нашем приложении, поэтому я знаю, что он работает. –

+0

Хорошо, еще одна деталь для тех, кто занимается этим. В нашей форме пользователь имел возможность отменить и выбрать другое изображение. Он фактически добавляет .MOV и .jpg в ту же директорию tmp, которая нарушит мое предложение выше, потому что оно не будет отображать правильный jpg с правильным .MOV. Там может быть более чистый способ, но я исправил его, посмотрев NSFileModificationDate из всех jpg в папке и используя последнюю. –

0

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

10

Надеюсь, мой код поможет вам, ребята. Это ужасно. Я думаю, что яблоко должно открывать такие 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 ... 
} 
+0

Ничего себе это работало как шарм. Спасибо. – Ish

+0

отображается ошибка недопустимого типа приемника void * –

+0

To Rahul Vyas, Код используется в моем проекте и работает хорошо. – alvin

1

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

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

+0

+1 для четкого и краткого объяснения – Sam

+0

Используйте решение E-Madd для обоих сценариев – Sam

5

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

+0

Это. Просто создайте экземпляр MPMoviePlayerController и используйте его для захвата эскиза с пути в обратном вызове, будь то из библиотеки или из видео, которое вы только что записали. Работает отлично. – Sam

+0

Этот метод является лучшим, без сомнения. Однако он доступен из iOS 3.2 и более поздних версий. Итак, если вы хотите поддерживать более старую iOS в своем приложении. Вам нужно будет использовать другой метод. –

+3

Важное примечание ... MPMoviePlayerController кажется ** автовоспроизведением ** после init. Убедитесь, что вы явно остановите его после его создания, или пользователи услышат звук из своих динамиков, если они не отключены. – jocull

5
NSString *videoLink=[info objectForKey:@"UIImagePickerControllerMediaURL"]; 

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:(NSURL*)videoLink]; 
UIImage *imageSel = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame]; 
[player stop]; 
[player release]; 
Смежные вопросы