2013-11-25 2 views
11

Ich benutze UIImagePickerController, um Video aus der Galerie auszuwählen und es komprimieren dieses Video.Ich möchte die Komprimierung deaktivieren, aber ich finde den Weg nicht dazu. Ich habe auch versucht mit ELCImagePickerController es zeigt Video, aber es sieht aus wie ein Bild nur gibt es kein Video-Symbol oder die Zeitdauer wie es in UIImagePickercontroller zeigt. Wie kann ich es tun?So vermeiden Sie die Komprimierung nach der Auswahl von Video von UIImagePickerController in ios

Danke.

Antwort

18

Es sieht nicht so aus, als wäre es möglich, die Komprimierung mit dem UIImagePickerController zu vermeiden. Sehen Sie diese Antwort:

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

Ich habe versucht, mit imagePicker.videoQuality = UIImagePickerControllerQualityTypeHigh; aber es funktioniert immer noch Kompression. Pfui.

EDIT:

Allerdings können Sie Ihre eigene Rolle. Dadurch wird der Zugriff auf die rohen Videodateien ermöglichen:

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

Blick auf die PhotoKit Dokumentation für Sammlungen (Momente) und andere Optionen zugreifen.

Hier ist eine Beispielanwendung von Apple mit PhotoKit, die geändert werden könnte ein Foto-Picker zu sein: https://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html

Hier ein Foto-Picker-Bibliothek auf GitHub ist die PhotoKit verwendet, die vielversprechend aussieht, da es Ihnen die PHAsset Objekte gibt für alle ausgewählten Bilder/Videos: https://github.com/guillermomuntaner/GMImagePicker

iOS 7 und unter

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

Eigentlich kann man das bekommen Original-Video-URL, nicht-komprimierte Version, über den folgenden Code:

- (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. 
      } 
     }]; 
    } 
} 

Zur Erinnerung: der requestAVAssetForVideo Aufruf ist asynchron, also seien Sie vorsichtig, wenn Sie die URL mit einem blockierten Variable außerhalb des Verfahrens Aufrufsatz speichern mögen .

1

Mit iOS 11 können Sie die Eigenschaft "videoExportPreset" verwenden. Es ist nicht das Original, aber zumindest kann ich mehr als 1280x720 bekommen ...

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

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

Mit iOS 11 Sie die Eigenschaft videoExportPreset auf AVAssetExportPresetPassthrough festlegen können, das Original zu erhalten:

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

„Video Komprimierung ... "Label blinkt nur für einige Millisekunden und dann ist der Export fertig.

@Diego Renau fast hatte die richtige Antwort.

Verwandte Themen