5

[library writeVideoAtPathToSavedPhotosAlbum:movieUrl completionBlock:^(NSURL *assetURL, NSError *error) ブロックを使用してアセット ライブラリにビデオを書き込んでいます。ビデオがアセット ライブラリに完全に書き込まれる前に URL を指定します。ブロック内のライブラリを列挙してビデオの属性を取得すると、上記のブロックで指定された URL に対してビデオが取得されませんでした。同じ URL を使用してアセット ライブラリを手動で 3 ~ 4 回再列挙すると、動画の属性が取得されます。この問題は主に、5 分を超えるビデオを作成したときに発生します。私のコードは次のとおりです。

    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];
}
4

1 に答える 1

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
                           }];
    }
}];
于 2013-03-19T07:43:29.403 に答える