2013-11-25 14 views

risposta

18

Non sembra che sia possibile evitare la compressione utilizzando UIImagePickerController. Vedere questa risposta:

https://stackoverflow.com/a/5893066/406152

Ho provato con imagePicker.videoQuality = UIImagePickerControllerQualityTypeHigh; ma lo fa ancora di compressione. Ugh.

EDIT:

Tuttavia, si può rotolare il proprio. Ciò consentirà l'accesso ai file video grezzi:

iOS 8

PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil]; 
for (PHAsset *asset in assetsFetchResult) { 
    PHVideoRequestOptions *videoRequestOptions = [[PHVideoRequestOptions alloc] init]; 
    videoRequestOptions.version = PHVideoRequestOptionsVersionOriginal; 

    [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:videoRequestOptions resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) { 
     // the AVAsset object represents the original video file 
    }]; 
} 

consultare la documentazione per l'accesso PhotoKit collezioni (momenti) e altre opzioni.

Ecco un'applicazione di esempio da Apple utilizzando PhotoKit che potrebbe essere modificato per essere una foto raccoglitrice: https://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html

Ecco una libreria fotografica selettore su GitHub che utilizza PhotoKit che sembra essere molto promettente in quanto ti dà le PHAsset oggetti per tutti i selezionati immagini/video: https://github.com/guillermomuntaner/GMImagePicker

iOS 7 e sotto

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
    if (group) { 
     // If you want, you can filter just pictures or videos 
     // I just need videos so I do this: 
     [group setAssetsFilter:[ALAssetsFilter allVideos]]; 

     [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){ 
      if (asset){ 
       // You can now add this ALAsset in your own video picker. 
       // Note that you can only access the ALAsset as long as 
       // you maintain a reference to the ALAssetsLibrary 

       // Or if you want to process the video, you can create an AVAsset: 
       NSURL *url = asset.defaultRepresentation.url; 
       AVAsset *videoAsset = [AVAsset assetWithURL:url]; 
      } 
     }]; 
    } 
} failureBlock:^(NSError *error) { 
    NSLog(@"error enumerating AssetLibrary groups %@\n", error); 
}]; 
4

In realtà, è possibile ottenere il URL originale video, versione non compressa, tramite il seguente codice:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    NSString *mediaType = info[UIImagePickerControllerMediaType]; 
    NSString *videoString = (NSString *)kUTTypeVideo; 
    NSString *movieString = (NSString *)kUTTypeMovie; 

    if ([mediaType isEqualToString:videoString] || [mediaType isEqualToString:movieString]) { 
     NSURL *videoRef = info[UIImagePickerControllerReferenceURL]; 
     PHFetchResult *refResult = [PHAsset fetchAssetsWithALAssetURLs:@[videoRef] options:nil];                                   
     PHVideoRequestOptions *videoRequestOptions = [[PHVideoRequestOptions alloc] init]; 
     videoRequestOptions.version = PHVideoRequestOptionsVersionOriginal; 
     [[PHImageManager defaultManager] requestAVAssetForVideo:[refResult firstObject] options:videoRequestOptions resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) { 
      if ([asset isKindOfClass:[AVURLAsset class]]) { 
        NSURL *originURL = [(AVURLAsset *)asset URL]; 
        // Now you have the URL of the original video. 
      } 
     }]; 
    } 
} 

Come promemoria, la chiamata requestAVAssetForVideo è asincrona, quindi state attenti quando si desidera memorizzare l'url con una variabile bloccata al di fuori del blocco di metodo di chiamata .

1

Con iOS 11 è possibile utilizzare la proprietà "videoExportPreset". Non è l'originale, ma almeno posso ottenere più di 1280x720 ...

if #available(iOS 11.0, *) { 
     picker.videoExportPreset = AVAssetExportPreset1920x1080 
} else { 
      // Fallback on earlier versions 
} 

//AVAssetExportPreset640x480 
//AVAssetExportPreset960x540 
//AVAssetExportPreset1280x720 
//AVAssetExportPreset1920x1080 
//AVAssetExportPreset3840x2160 
1

Con iOS 11 è possibile impostare la proprietà videoExportPreset per AVAssetExportPresetPassthrough per ottenere l'originale:

if #available(iOS 11.0, *) { 
    picker.videoExportPreset = AVAssetExportPresetPassthrough 
} 

Il "Video compressione ... "l'etichetta lampeggia per pochi millisecondi e quindi l'esportazione viene eseguita.

@Diego Renau quasi ha avuto la risposta corretta.

Problemi correlati