Advertise here




Advertise here

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

add metadata GPS to video in savedPhotosAlbum Xcode iOS

gbennagbenna Posts: 141 @ @
edited October 2016 in iOS SDK Development
When I take a video using UIImagePickerController and save it to SavedPhotosAlbum using
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library writeVideoAtPathToSavedPhotosAlbum:(NSURL *)movieURL 
    completionBlock:^(NSURL *assetURL, NSError *error){
    if (error) {
    NSLog(@Save video fail:%@",error);
    } else {
    NSLog(@Save video succeed.);
    [self getsavedvideo];
    }}];

the saved file contains a name and creation date but not the GPS info. I am surprised by this since I am using the built in camera and the imagePicker. Why wouldn't Apple just include the GPS coordinates (even if I had to ask users permission to use location services).

anyway I digress

I have not found anyway to add the GPS coordinates to the video as it is being saved and I haven't been able to find anyway to add the this information in the completionBlock.

If someone knows how please let me know.

So I wrote a bit of code that is called after the video is saved [self getsavedvideo]; above which gets the saved video and I can get the movie name and creation date and it shows there is no location info.
-(void) getsavedvideo;{
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
// Enumerate just the photos and videos group by using ALAssetsGroupSavedPhotos.
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
// Within the group enumeration block, filter to enumerate just photos.
[group setAssetsFilter:[ALAssetsFilter allVideos]];
// Chooses the photo at the last index
[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) {
// The end of the enumeration is signaled by asset == nil.
if (alAsset) {
ALAssetRepresentation *representation = [alAsset defaultRepresentation];
// Stop the enumerations
*stop = YES; *innerStop = YES;
// Do something interesting with the AV asset.
NSString *fileName = [representation filename];
NSDate *myDate = [alAsset valueForProperty:ALAssetPropertyDate];
CLLocation *location = [alAsset valueForProperty:ALAssetPropertyLocation];
NSLog(@fileName!!!!,%@,fileName);
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:mad:dd-MM-yyyy 'at' HH:mm"];
NSLog( @date for this file is %@ %@", [[[alAsset defaultRepresentation] url] absoluteString], [dateFormatter stringFromDate: myDate] );
NSLog (@locate!!!!%@",location);
} }];
} failureBlock: ^(NSError *error) {
NSLog(@No groups);}];}

so does anyone know how to append this with the GPS information and save it back to the video's metadata.
I have been wracking my brains out on this for a few days and haven't really found anything helpful.

Plz help

Replies

  • gbennagbenna Posts: 141 @ @
    So I figured this out for a device running ios8 or newer anyway.

    add this code in the
    -(void) getsavedvideo that was in the completionBlock above.
    
    Make sure you have 
             #import <Photos/Photos.h>
    
             if ([PHAsset class]) { // If this class is available, we're running iOS 8
                
                PHFetchOptions *fetchOptions = [PHFetchOptions new];
                fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@creationDate ascending:NO]];
                fetchOptions.fetchLimit = 1;
                PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:fetchOptions];
                PHAsset *lastImageAsset = [fetchResult lastObject];
                
                [[PHImageManager defaultManager]requestImageForAsset:lastImageAsset   targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage *result, NSDictionary *info){
                    if ([info objectForKey:PHImageErrorKey] == nil && ![[info objectForKey:PHImageResultIsDegradedKey] boolValue]) {
                        
                        NSArray *resources = [PHAssetResource assetResourcesForAsset:lastImageAsset];
                        NSString *orgFilename = ((PHAssetResource*)resources[0]).originalFilename;
                       
                        
                        
                        [lastImageAsset requestContentEditingInputWithOptions:nil
                                                   completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
                                                       NSURL *imageURL = contentEditingInput.fullSizeImageURL;
                                                       NSString *urlstring = [imageURL absoluteString];
                                                       NSLog(@urlstring%@",urlstring);
                                                   }];
                    
                    
                        
                        CLLocationCoordinate2D    locationNew = CLLocationCoordinate2DMake( currentLocation.coordinate.latitude, currentLocation.coordinate.longitude) ;
                        NSDate *nowDate = [NSDate date];
                        
                        CLLocation *myLocation = [[CLLocation alloc ]initWithCoordinate:locationNew altitude:0.0 horizontalAccuracy:1.0 verticalAccuracy:1.0 timestamp:nowDate];
                        
                      
                        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                            // Create a change request from the asset to be modified.
                            PHAssetChangeRequest *request = [PHAssetChangeRequest changeRequestForAsset:lastImageAsset];
                            // Set a property of the request to change the asset itself.
                            request.location = myLocation;
                            
                        } completionHandler:^(BOOL success, NSError *error) {
                            NSLog(@Finished updating asset. %@", (success ? @Success. : error));
                        }];
                    }
               }];
            }
        
    
            else {
                  //if you aren't running ios8 or newer I haven't found a way to add/change metadata but I will keep looking.So if you leave this blank no new metadata is added.
        }
    

    You can add other metadata just create the data in the form needed and then use request.(what you want to change) = new data.

    you can check to see if the data already exist and if there is a metadata for it by putting in something like

    lastImageAsset (which was the PHAsset fetch result above) and then the property like

    NSDate *originalFileDate = [lastImageAsset creationDate]; etc.
    there is a list at
    https://developer.apple.com/reference/photos/phasset
Sign In or Register to comment.