2009-08-11 19 views
8

Por lo que he leído, Apple no expone la API para permitir a los desarrolladores obtener una miniatura de una película con la SDK actual.iphone sdk> 3.0. ¿Miniatura de video?

¿Alguien puede compartir algún código sobre cómo van sobre esto? He oído que puede acceder a la vista del selector de la cámara y encontrar la vista de la imagen justo antes de que se cierre el selector de imágenes ui. Esto parece un poco feo.

También se consideró usar ffmpeg para tomar un fotograma de la película pero no tenía ni idea de cómo compilarlo como una biblioteca para el iphone. Cualquier puntero sería muy apreciado

Respuesta

8

Hay un jpg en la misma carpeta que la película que es la miniatura. Solo lo he probado con video grabado desde el teléfono, pero funciona bien. No tiene el mismo nombre que la película, así que busca la ruta del directorio donde se encuentra la película e itera para .jpg y listo.

+0

Voy a dar una explosión y te lo haré saber – ADAM

+1

Déjame saber cómo salió todo. Puedo publicar un código que lo haga por usted si tiene algún problema. Acabo de implementar esto en nuestra aplicación, así que sé que funciona. –

+0

Bien, hay otro detalle para los que juegan con esto. En nuestra forma, el usuario tenía la capacidad de cancelar y elegir otra imagen. De hecho, agrega .MOV y .jpg al mismo directorio tmp, lo que rompería mi sugerencia anterior porque no correlacionaría el jpg correcto con el .MOV correcto. Puede haber una manera más limpia, pero lo solucioné mirando el NSFileModificationDate de todos los jpgs en la carpeta y usando el último. –

0

Si usa UIImagePickerController para obtener la imagen, entonces no se almacenará un JPG en el directorio tmp. No estoy seguro de la respuesta para esto, pero ffmpeg, más específicamente las bibliotecas detrás de él, pueden ser su opción.

10

Espero que mi código pueda ayudarlos chicos. Es feo Creo que Apple debería abrir este tipo de API. Por supuesto, todos los NSLog() deberían eliminarse. Es solo para la demostración.

Alvin

- (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

Wow, esto funcionó como un encanto. Muchas gracias. – Ish

+0

muestra el error tipo de receptor inválido void * –

+0

Para Rahul Vyas, El código se usa en mi proyecto y funciona bien. – alvin

1

Sólo quería ofrecer una actualización sobre esto. Las cosas parecen funcionar en términos de obtener la miniatura cuando ha configurado su selector en UIImagePickerControllerSourceTypeCamera. Sin embargo, cuando intenta elegir de la biblioteca existente (es decir, UIImagePickerControllerSourceTypePhotoLibrary) el .jpg para la miniatura nunca se crea. Incluso intenté volver a guardar con UISaveVideoAtPathToSavedPhotosAlbum (...) y todavía no hay dados. Parece que la miniatura se crea primero cuando se captura el video. Esa es tu única oportunidad de "agarrarlo". Luego se mueve a un subdirectorio de/var/mobile/Media/DCIM /. Si bien puede enumerar la imagen en miniatura y ver que está allí, ese archivo no se puede leer ni copiar, ya que creo que el directorio está protegido.

Si alguien tiene una solución para esto, lo agradecería mucho ya que en mi caso necesito tomar la miniatura del video existente después de elegirlo de la biblioteca.

+0

+1 para una explicación clara y concisa – Sam

+0

Use la solución de E-Madd para ambos escenarios – Sam

5

mejor método que he encontrado ... MPMoviePlayerController thumbnailImageAtTime: timeOption

+0

Esto. Simplemente cree una instancia de MPMoviePlayerController y úselo para tomar una miniatura de la ruta en la devolución de llamada, ya sea desde la biblioteca o desde un video que acaba de grabar. Funciona bien. – Sam

+0

Este método es el mejor, sin dudas. Sin embargo, está disponible desde el iOS 3.2 y posterior. Por lo tanto, si desea admitir iOS antiguo en su aplicación. Necesitarás usar el otro método. –

+3

Nota importante ... MPMoviePlayerController parece ** reproducir automáticamente ** después de iniciar. Asegúrese de detenerlo explícitamente después de crearlo, o los usuarios escucharán el sonido de sus altavoces si no están silenciados. – 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]; 
Cuestiones relacionadas