2013-01-02 9 views
5

Piszę wideo w Bibliotece zasobów za pomocą [writeVideoAtPathToSavedPhotosAlbum biblioteka: movieUrl completionBlock:^(bibliotece NSURL * assetURL, NSError * error) blokują daje adres URL, zanim film całkowicie zapisze w bibliotece zasobów. A kiedy wyliczyłem bibliotekę wewnątrz bloku, aby uzyskać atrybuty wideo, nie dostałem żadnego wideo przeciwko URLowi podanemu przez powyższy blok. Jeśli ręcznie ponownie wyliczy bibliotekę zasobów 3 lub 4 razy z tym samym adresem URL, otrzymam pliki wideo. Ten problem najczęściej występuje kiedy robię film trwający powyżej 5 min Mój kod to:Jaki jest prawidłowy sposób napisać wideo w bibliotece zasobów, a następnie uzyskać ich atrybuty

library = [[ALAssetsLibrary alloc] init]; 
    [library writeVideoAtPathToSavedPhotosAlbum:movieUrl completionBlock:^(NSURL *assetURL, NSError *error) 
    { 
     savedAssetURL = assetURL; 
     [self assetsEmumeration:assetURL]; 
     NSLog(@"asset url %@",assetURL); 
     if(error) 
     { 
      UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Failed" message:[error localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:Nil]; 
      [alertView show]; 
     } 
    }]; 

    -(void) assetsEmumeration:(NSURL *)_url 
    { 
    NSLog(@"assets enumeration "); 
    ALAssetsLibrary *al;  
    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) 
    { 
     [group setAssetsFilter:[ALAssetsFilter allVideos]] ; 
     [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) 
     { 
      if (asset) 
      { 
       ALAssetRepresentation *representation = [asset defaultRepresentation]; 
       NSURL *url = [representation url]; 
       if([[url absoluteString] isEqualToString:[_url absoluteString]]) 
       { 
        found = TRUE; 
        NSDictionary *asset_options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; 
        AVAsset *avAsset = [[AVURLAsset alloc] initWithURL:url options:asset_options]; 
        Float64 dur = CMTimeGetSeconds(avAsset.duration); 
        NSString *fileName = [representation filename]; 

        appDelegate.videoLength = [NSString stringWithFormat:@"%f seconds",dur]; 
        appDelegate.videoSize = [NSString stringWithFormat:@"%lld bytes",[representation size]]; 
        appDelegate.originalFileName = [NSString stringWithFormat:@"%@",fileName]; 
        [MBProgressHUD hideHUDForView:self.view animated:YES]; 
        ExtraInfoViewController *extraInfoViewObj = [[ExtraInfoViewController alloc] init]; 
        [self.navigationController pushViewController:extraInfoViewObj animated:YES]; 
        NSLog(@"duration:%f,fileName:%@",dur,fileName); 
       } 
       else 
       { 
        found = FALSE; 
       }  
      } 
     }]; 
     if(found == FALSE) 
     { 
      NSLog(@"video not found"); 
     } 
    };  
    void (^assetFailureBlock)(NSError *) = ^(NSError *error) 
    { 
     NSLog(@"failure"); 
     if(ALAssetsLibraryAccessGloballyDeniedError) 
     { 
      UIAlertView *alerview = [[UIAlertView alloc] initWithTitle:@"Denied" message:@"Failed to get the meta data. Access to assets library is denied" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:Nil]; 
      [alerview show]; 
     } 
    }; 
    al=[RecordVideoViewController defaultAssetsLibrary]; 
    [al enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:assetFailureBlock]; 
} 

Odpowiedz

6
// find out alAsset for that url and then do whatever you want with alAsset. 
library = [[ALAssetsLibrary alloc] init]; 
[library writeVideoAtPathToSavedPhotosAlbum:movieUrl completionBlock:^(NSURL *assetURL, NSError *error) 
{ 
    savedAssetURL = assetURL; 
    NSLog(@"asset url %@",assetURL); 
    if(error) 
    { 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Failed" message:[error localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:Nil]; 
     [alertView show]; 
    } 
    else 
    { 
     [library assetForURL:assetURL 
          resultBlock:^(ALAsset* alAsset) { 
          // do whatever you want with alAsset 
          }]; 
    } 
}]; 
Powiązane problemy