2011-10-14 2 views
1

У меня проблема с MPMoviePlayerController (self.mp). Когда я хочу получить доступ к duration собственности, я получаю 0, когда я хочу получить доступ thumbnail…, я получаю nil. На iOS 4 все в порядке, iOS 5 - нет.MPMoviePlayerController без содержимого (iOS 5) - Операция не может быть завершена

В конце концов приложение говорит мне: операция не может быть завершена.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 
    if([[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:(NSString *)kUTTypeMovie]){ 
     NSString *tempFilePath = [[info objectForKey:UIImagePickerControllerMediaURL] path]; 


     NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
     double hashToNameOfFile = [NSDate timeIntervalSinceReferenceDate] * 1000.0; 
     NSString *finalPath = [rootPath stringByAppendingPathComponent:[NSString stringWithFormat: @"%.0f.%@", hashToNameOfFile, @"MOV"]]; 
     NSString *finalPathToThumbRetina = [rootPath stringByAppendingPathComponent:[NSString stringWithFormat: @"thumb_%[email protected]%@", hashToNameOfFile, @"jpg"]]; 
     NSString *finalPathToThumb = [rootPath stringByAppendingPathComponent:[NSString stringWithFormat: @"thumb_%.0f.%@", hashToNameOfFile, @"jpg"]]; 

     // we do need retina now, we use real name for CoreData 
     NSString *finalImage = [finalPath lastPathComponent]; 
     NSString *finalImageThumb = [finalPathToThumb lastPathComponent]; 


     if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(tempFilePath)){ 
      // Copy it to the camera roll. 
      UISaveVideoAtPathToSavedPhotosAlbum(tempFilePath, self, @selector(video:didFinishSavingWithError:contextInfo:), tempFilePath); 
     } 

     // save video to application directory 
     NSData *videoData = [NSData dataWithContentsOfFile:tempFilePath]; 
     if ([videoData writeToFile:finalPath atomically:YES]) { 
      NSLog(@"SAVED"); 
     } 
     else{ 
      NSLog(@"NOT SAVED"); 
     } 


     // create thumbnail of video 
     MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:finalPath]]; 
     self.mp = moviePlayer; 
     [moviePlayer release]; 

     NSData *videoData2 = [NSData dataWithContentsOfFile:finalPath]; 
     NSLog(@"LENGTH %i", [videoData2 length]); 


     NSLog(@"FINAL PATH %@", finalPath); 
     UIImage *image = [[[UIImage alloc] init] autorelease]; 
     image = [self.mp thumbnailImageAtTime:(NSTimeInterval)1.0 timeOption:MPMovieTimeOptionNearestKeyFrame]; 
     NSLog(@"%@", [image size]); 
     UIImage *thumbImageRetina = [image thumbnailImage:400 transparentBorder:0 cornerRadius:0 interpolationQuality:kCGInterpolationDefault]; 
     UIImage *thumbImage = [image thumbnailImage:200 transparentBorder:0 cornerRadius:0 interpolationQuality:kCGInterpolationDefault]; 
     NSData *thumbImageRetinaData = [NSData dataWithData:UIImageJPEGRepresentation(thumbImageRetina, 1.0)]; 
     NSData *thumbImageData = [NSData dataWithData:UIImageJPEGRepresentation(thumbImage, 1.0)]; 
     if ([thumbImageRetinaData writeToFile:finalPathToThumbRetina atomically:YES]) { 
      NSLog(@"RETINA THUMB SAVED"); 
     } 
     else{ 
      NSLog(@"RETINA THUMB NOT SAVED"); 
     } 
     if ([thumbImageData writeToFile:finalPathToThumb atomically:YES]) { 
      NSLog(@"THUMB SAVED"); 
     } 
     else{ 
      NSLog(@"THUMB NOT SAVED"); 
     } 

     // duration of video 
     double dur = [self.mp duration]; 
     NSLog(@"DUR %f", dur); 


     TaleRecords *newTaleRecord = (TaleRecords *)[NSEntityDescription insertNewObjectForEntityForName:@"TaleRecords" inManagedObjectContext:_context]; 

     newTaleRecord.content = finalImage; 
     newTaleRecord.date = [NSDate date]; 
     NSDecimalNumber *latNum = [[NSDecimalNumber alloc] initWithDouble:[self.latitude doubleValue]]; 
     NSDecimalNumber *longNum = [[NSDecimalNumber alloc] initWithDouble:[self.longitude doubleValue]]; 
     newTaleRecord.latitude = latNum; // vertical 
     newTaleRecord.longitude = longNum; // horizontal 
     [latNum release]; 
     [longNum release]; 
     newTaleRecord.contentType = [[NSString alloc] initWithFormat:@"cTypeVideo"]; 
     newTaleRecord.thumb = finalImageThumb; 
     newTaleRecord.duration = [NSNumber numberWithDouble:dur]; 

     newTaleRecord.tale = tales; 
     tales.record = [newTaleRecord tale].record; 

     NSError *error = nil; 
     if (![_context save:&error]) { 
      /* 
      Replace this implementation with code to handle the error appropriately. 

      abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. 
      */ 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 


    [CLController.locationManager stopUpdatingLocation]; 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Более простой пример

Я делаю это:

// save video to application directory 
NSData *videoData = [NSData dataWithContentsOfFile:tempFilePath]; 
if ([videoData writeToFile:finalPath atomically:YES]) { 
    NSLog(@"SAVED"); 
} 
else{ 
    NSLog(@"NOT SAVED"); 
} 

В tempFilePath это реальное видео содержание и я пишу его finalPath. После этого я создаю экземпляр MPMoviePlayerController:

MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:finalPath]]; 
self.mp = moviePlayer; 
[moviePlayer release]; 

Но self.mp не дают мне никакого содержания. Когда я хочу сделать [self.mp duration], он возвращает zero/nil. Путь к ресурсу работает, но, похоже, контент отсутствует.

Благодарим за помощь.

+0

Это, безусловно, поможет, если вы предоставили более простой пример ... может помочь вам, как хорошо! –

+0

ОК, я добавил ** Более простой пример **. – petesalt

ответ

3

Я понял свою проблему. Это как iOS5 не устраивает:

NSString *tempFilePath = [[info objectForKey:UIImagePickerControllerMediaURL] path]; 

так что вместо этого, если вы просто использовать

NSURL *someUrl =[info objectForKey:UIImagePickerControllerMediaURL] ; 

, а затем первоначальный mpmovieplayercontroller с этим URL, он отлично работает для меня, который точно напротив iOS4.

вот мой код:

- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 



    mediaURL = [info objectForKey:UIImagePickerControllerMediaURL]; 
    NSLog(@"%@",mediaURL); 
    if (!mymoviePlayer) { 
     mymoviePlayer=[[MPMoviePlayerController alloc]initWithContentURL:mediaURL]; 
     [mymoviePlayer setControlStyle:MPMovieControlStyleNone]; 
     [mymoviePlayer.view setFrame: videoView.bounds]; 
     [videoView addSubview:mymoviePlayer.view]; 
    } 
    else 
    { 

     [mymoviePlayer setContentURL:mediaURL]; 
     [mymoviePlayer stop]; 
     [mymoviePlayer setInitialPlaybackTime:-1]; 
    } 

[self dismissModalViewControllerAnimated:YES]; 


} 
+0

Большое спасибо. Это то, что мне нужно. У меня есть другие проблемы с видео на iOS5, но это самый большой. Еще раз спасибо. – petesalt

+1

Argh! Имел ту же проблему, что и вы, и взял меня на себя, чтобы понять, что MPMoviePlayerController не любит определенные NSURL, даже если они считаются действительными объектами системы. «Секрет» заключается в том, чтобы получить путь к файлу как NSString, а затем использовать '[NSURL fileURLWithPath: URLStringPath]' – Rog

+0

Комментарий Рога - это точный ответ. –

Смежные вопросы