2013-11-25 23 views
11

UIImagePickerControllerを使用してギャラリーからビデオを選択し、そのビデオを圧縮します。圧縮を無効にしたいが、これを行う方法が見つからない。 私はELCImagePickerControllerでビデオを表示していますが、UIImagePickercontrollerで表示されているようなビデオアイコンや時間は表示されません。どのようにすればいいですか?iosのUIImagePickerControllerからビデオを選択した後に圧縮を避ける方法

ありがとうございました。

答えて

18

UIImagePickerControllerを使用した圧縮を避けることはできないようです。私はimagePicker.videoQuality = UIImagePickerControllerQualityTypeHigh;を使用して試してみたが、それはまだ圧縮を行い

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

:この回答を参照してください。ああ。

編集:

ただし、自分でロールすることはできます。これは、生のビデオファイルへのアクセスを許可します:

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

コレクション(瞬間)および他のオプションにアクセスするためのPhotoKitのドキュメントを見てください。ここで

写真ピッカーように修正することができPhotoKitを使用して、アップルからのサンプルアプリです:それはのためにあなたにPHAssetオブジェクトを提供しますので、ここでhttps://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html

は有望に見えるPhotoKitを使用していますGitHubの上のフォトピッカーライブラリです選択されたすべての画像/動画:https://github.com/guillermomuntaner/GMImagePicker

のiOS 7と実際

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

以下、あなたが得ることができますオリジナル動画のURL、非圧縮バージョンは、次のコードを経由して:リマインダーとして

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

、requestAVAssetForVideoコールを使用すると、メソッドの呼び出しブロックの外にブロックされた変数にURLを保存するときに注意してください、非同期です。

1

iOS 11では、プロパティ "videoExportPreset"を使用できます。 それはオリジナルではないですが、少なくとも私は、iOSの11で以上1280×720 ...

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

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

を得ることができますが、元を取得するためにAVAssetExportPresetPassthroughにプロパティvideoExportPresetを設定することができます。

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

「ビデオ圧縮... "ラベルがちょうど数ミリ秒間点滅し、エクスポートが完了します。

@Diego Renau ほぼが正解でした。

関連する問題